gpt4 book ai didi

Django:如何在 Factory Boy 工厂和序列化程序中正确使用 ManyToManyField?

转载 作者:行者123 更新时间:2023-12-04 17:40:31 24 4
gpt4 key购买 nike

问题

我正在使用模型类 Event包含一个可选的 ManyToManyField 到另一个模型类,User (不同的事件可以有不同的用户),有一个工厂类EventFactory (使用 Factory Boy 库)带有序列化程序 EventSerializer .我相信我已经遵循了工厂制作和序列化的文档,但我收到了错误:

ValueError: "< Event: Test Event >" needs to have a value for field "id" before this many-to-many relationship can be used.



我知道在链接它们之前必须在多对多中创建两个模型实例,但我看不到添加的位置!

问题

有人可以阐明如何以我尚未采用的方式使用模型、工厂男孩和序列化程序正确使用 ManyToManyField 吗?

设置

这是我的代码:

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

factory.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',)

测试.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值,而后者是(参见 factory docsmodel docs )。

    我怀疑序列化程序仍然希望对象具有 id ,即使多对多关系是可选的,因为它不能在没有 id 的情况下强制潜在关系.

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

    关于Django:如何在 Factory Boy 工厂和序列化程序中正确使用 ManyToManyField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694757/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com