Django:如何正确使用ManyToManyField与Factory Boy Factory和Serializers?



问题

我正在使用一个模型类Event,该类别包含可选 Manytomanyfield到另一个模型类,User(不同的事件可以具有不同的用户),带有工厂类EventFactory(使用工厂男孩库)串行器EventSerializer。我相信我已经遵循文档进行工厂制作和序列化,但是正在收到错误:

valueerror:"< event:test event>"需要具有字段" id"的值 在这种多一关系之前,可以使用。

我知道两个模型实例必须在链接之前创建在多塔米尼,但我看不到添加甚至在哪里发生!

问题

有人可以澄清如何使用模型,工厂男孩和连续化器正确使用Manytomanyfield,以我尚未做的方式?

设置

这是我的代码:

models.py

@python_2_unicode_compatible
class Event(CommonInfoModel):
    users = models.ManyToManyField(User, blank=True, related_name='events')
    # other basic fields...

fortories.py

class EventFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.Event
    @factory.post_generation
    def users(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return
        if extracted:
            # A list of users were passed in, use them
            # NOTE: This does not seem to be the problem. Setting a breakpoint                     
            # here, this part never even fires
            for users in extracted:
                self.users.add(users)

serializers.py

class EventSerializer(BaseModelSerializer):
    serialization_title = "Event"
    # UserSerializer is a very basic serializer, with no nested 
    # serializers
    users = UserSerializer(required=False, many=True)
    class Meta:
        model = Event
        exclude = ('id',)

test.py

class EventTest(APITestCase):
@classmethod
def setUpTestData(cls):
    cls.user = User.objects.create_user(email='test@gmail.com',  
    password='password')
def test_post_create_event(self):
    factory = factories.EventFactory.build()
    serializer = serializers.EventSerializer(factory)
    # IMPORTANT: Calling 'serializer.data' is the exact place the error occurs!
    # This error does not occur when I remove the ManyToManyField
    res = self.post_api_call('/event/', serializer.data)

版本信息

  • django 1.11
  • Python 2.7.10

感谢您提供的任何帮助!

关于错误:看来丢失的id是由于使用.build()而不是.create()(或仅使用EventFactory())。前者不能保存模型,因此它没有获得id值,而后者则没有(请参阅工厂文档和模型文档)。

我怀疑序列化器仍然期望该对象具有id,即使多次恋爱关系是可选的,因为它无法在没有id的情况下执行潜在的关系。

但是,实际任务可能有更简单的解决方案。上面的方法是生成传递给post_api_call()的POST数据的方法。如果该数据是手动创建的,则工厂和序列化器都不需要。从测试角度来看,显式数据方法甚至可能更好,因为您现在可以看到必须产生预期结果的确切数据。而使用工厂和序列化方法,它在测试中实际使用的内容中更隐含。

相关内容

  • 没有找到相关文章

最新更新