Проблема
Я использую класс модели Event
, который содержит необязательный объект ManyToManyField для другого класса модели, User
(у разных событий могут быть разные пользователи), с фабричным классом EventFactory
(с использованием библиотеки Factory Boy) и сериализатором EventSerializer
. Я считаю, что следовал документам по производству и сериализации на заводе, но получаю сообщение об ошибке:
ValueError: «‹ Event: Test Event >» должно иметь значение для поля «id», прежде чем можно будет использовать эту связь «многие ко многим».
Я знаю, что оба экземпляра модели должны быть созданы в ManyToMany перед их связыванием, но я не вижу, где вообще происходит добавление!
Вопрос
Может ли кто-нибудь объяснить, как правильно использовать ManyToManyField с помощью моделей, factory boy и сериализаторов так, как этого еще не делаю я?
Настройка
Вот мой код:
models.py
@python_2_unicode_compatible
class Event(CommonInfoModel):
users = models.ManyToManyField(User, blank=True, related_name='events')
# other basic fields...
factories.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)
сериализаторы.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='[email protected]',
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)
Информация о версии
- Джанго 1.11
- Питон 2.7.10
Спасибо за любую помощь, которую вы можете оказать!
self.event
, но в своем сериализаторе вы передаетеfactory
. Я предполагаю, что это импортированный FactoryBoyfactory
. Возможно, вы хотели вместо этого поставитьself.event
? - person malberts   schedule 14.02.2019event
осталось после того, как я попытался сузить круг причин, вызывающих ошибку.factory
поскольку моя собственная объявленная переменная является предполагаемым использованием. Я обновил свой пост, чтобы представить это изменение. Спасибо, что указали на это! - person gpsugy   schedule 14.02.2019build()
не сохраняет объект (фабричные документы), поэтому он выиграл не имеют идентификатора (документы модели), что похоже на то, о чем говорит ошибка. Попробуйте сfactories.EventFactory.create()
или простоfactories.EventFactory()
(они делают то же самое). Что происходит тогда? - person malberts   schedule 14.02.2019create()
также сохраняет экземпляр модели в базе данных, что противоречило бы цели моего теста, состоящей в проверке запроса POST для создания нового экземпляраEvent
. Я обновил код, чтобы более четко показать это. Какие-нибудь мысли? - person gpsugy   schedule 14.02.2019create()
действительно устраняет ошибку. - person gpsugy   schedule 14.02.2019Event
, вам не следует использовать фабрику для его создания. Фабрики предназначены для создания фоновых тестовых данных (например, вещей, которые вам нужны для теста, а не вещей, которые вы тестируете напрямую). Продолжение в следующем комментарии... - person malberts   schedule 14.02.2019