如何解决如何在 Django 中使用 factoryboy 的 SubFactory 处理可空字段?
我想让 nullable
的 StoreFactory
存储属性。
如果我给出商店名称,我希望它返回现有的商店对象。
但是,它引发了错误。
我使用 SubFactory
创建了 store 字段。但它不能懒惰地检查event_type
。
如何使用现有的 store 对象获取 EventFactory 实例?
events/models.py:
SELL_DIRECT = "SD"
ORDER_PRODUCT = "OP"
SEND_PRODUCT = "SP"
SETTLE_SALE = "SS"
LEAVE_STORE = "LS"
DEFECT_PRODUCT_IN_STORE = "DS"
DEFECT_PRODUCT_IN_HOME = "DH"
EVENT_TYPE_CHOICES = (
(SELL_DIRECT,"개인판매"),(ORDER_PRODUCT,"제품발주"),(SEND_PRODUCT,"입점처 입고"),(SETTLE_SALE,"판매내역정산"),(LEAVE_STORE,"입점처 퇴점"),(DEFECT_PRODUCT_IN_STORE,"불량:입점처"),(DEFECT_PRODUCT_IN_HOME,"불량:집"),)
EVENT_TYPES_ABOUT_STORE = set(
[SEND_PRODUCT,SETTLE_SALE,LEAVE_STORE,DEFECT_PRODUCT_IN_STORE]
)
class Store(TimestampedModel):
""" 입점처 """
name = models.CharField(_("이름"),max_length=50,unique=True)
description = models.TextField(_("설명"))
class Event(TimestampedModel):
""" 재고 변화 내역 """
event_type = models.CharField(
_("재고 변화 타입"),choices=EVENT_TYPE_CHOICES,max_length=2
)
store = models.ForeignKey(
"Store",verbose_name=_("입점처"),on_delete=models.CASCADE,blank=True,null=True,)
description = models.TextField(_("설명"))
events/factories.py:
import factory
from events.models import (
EVENT_TYPES_ABOUT_STORE,EVENT_TYPE_CHOICES,)
class StoreFactory(factory.django.DjangoModelFactory):
class Meta:
model = "events.Store"
django_get_or_create = ("name",)
name = factory.Sequence(lambda n: f"store_{n}")
description = factory.Sequence(lambda n: f"description_{n}")
class EventFactory(factory.django.DjangoModelFactory):
class Meta:
model = "events.Event"
event_type = factory.Faker(
"random_element",elements=[choice[0] for choice in EVENT_TYPE_CHOICES]
)
description = factory.Sequence(lambda n: f"event_{n}")
@factory.lazy_attribute
def store(self):
if self.event_type in EVENT_TYPES_ABOUT_STORE:
return StoreFactory()
return None
入[20]:Store.objects.last()出[20]:
在 [21]: EventFactory.build(store__name='store_10').store Out[21]: ...
AttributeError: 参数“store__name”未知。评估
属性是 {'event_type': 'DS','description': 'event_4'},定义是
感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。