Factory-boy 属性属性?
Factory-boy property attributes?
我有这样的食谱:
import factory
from models import Foobar
class MenuItemFactory(factory.Factory):
class Meta:
model = MenuItem
name = 'Default Foobar'
url = factory.LazyAttribute(lambda o: '/%s' % o.name)
我想添加动态属性,例如 slug
,但我想在单独的方法中进行。我想要这个,因为在 lambda 单行代码中编写任何更复杂的逻辑都会很丑陋。
我想到了一个想法,使用 property
方法,就像他们在 Django 模型中所做的那样。例如:
class MenuItemFactory(factory.Factory):
...
@property
def url(self):
return '/%s' % self.name
有没有一种类似于此的方法可以完成我正在尝试做的事情?
编辑
我最终想要完成的是:
menu_item = MenuItemFactory(name='foobar')
menu_item.name = 'foobar'
menu_item.url = '/foobar'
其中 slug
充当动态属性。换句话说,我正在寻找一个合适的地方来存储我的 动态属性逻辑 。
您可以使用 属性 内置 https://docs.python.org/3.6/library/functions.html#property
class Test:
name = 'bar'
def fget(self):
return self.name
def fset(self, name):
self.name = name
Test.slug = property(fget=fget, fset=fset)
t = Test()
print(t.slug) # 'bar'
t.slug = 'foo'
print(t.slug) # 'foo'
事实证明它很简单,我花了一些时间才在文档中找到它。
@factory.lazy_attribute
def url(self):
return '/%s' % self.name
我有这样的食谱:
import factory
from models import Foobar
class MenuItemFactory(factory.Factory):
class Meta:
model = MenuItem
name = 'Default Foobar'
url = factory.LazyAttribute(lambda o: '/%s' % o.name)
我想添加动态属性,例如 slug
,但我想在单独的方法中进行。我想要这个,因为在 lambda 单行代码中编写任何更复杂的逻辑都会很丑陋。
我想到了一个想法,使用 property
方法,就像他们在 Django 模型中所做的那样。例如:
class MenuItemFactory(factory.Factory):
...
@property
def url(self):
return '/%s' % self.name
有没有一种类似于此的方法可以完成我正在尝试做的事情?
编辑
我最终想要完成的是:
menu_item = MenuItemFactory(name='foobar')
menu_item.name = 'foobar'
menu_item.url = '/foobar'
其中 slug
充当动态属性。换句话说,我正在寻找一个合适的地方来存储我的 动态属性逻辑 。
您可以使用 属性 内置 https://docs.python.org/3.6/library/functions.html#property
class Test:
name = 'bar'
def fget(self):
return self.name
def fset(self, name):
self.name = name
Test.slug = property(fget=fget, fset=fset)
t = Test()
print(t.slug) # 'bar'
t.slug = 'foo'
print(t.slug) # 'foo'
事实证明它很简单,我花了一些时间才在文档中找到它。
@factory.lazy_attribute
def url(self):
return '/%s' % self.name