Вопрос
Допустим, у меня есть модель, которая содержит OneToOneField
примерно так:
models.py
class Event(models.Model)
# some basic fields...
class EventDetail(models.Model):
event = models.OneToOneField(Event, on_delete=models.CASCADE,
related_name='event_detail')
# other basic fields, all with default values...
Как правильно реализовать запрос POST, который намеревается создать новый Event
в базе данных, который автоматически создает связанный с ним EventDetail по умолчанию, если в заголовке запроса указано None, с использованием сериализаторов Django Rest Framework?
Моя попытка
test.py
class EventTestCase(APITestCase):
def test_post(self):
# Need to provide an id, or else an error occurs about the OneToOneField
event = Event(id=1)
serializer = serializers.EventSerializer(event)
res = self.api_client.post('/event/', serializer.data)
views.py
def post(self, request, format=None):
serializer = EventSerializer(
data=request.data)
# ***This always returns false!***
if serializer.is_valid():
try:
instance = serializer.save()
except ValueError:
return Response(status=status.HTTP_400_BAD_REQUEST)
serializers.py
class EventSerializer(serializers.ModelSerializer):
serialization_title = "Event"
event_detail = EventDetailSerializer()
class Meta:
model = Event
exclude = ('id',)
error_status_codes = {
HTTP_400_BAD_REQUEST: 'Bad Request'
}
class EventDetailSerializer(serializers.ModelSerializer):
serialization_title = "Event Detail"
class Meta:
model = models.EventDetail
exclude = ('id',)
error_status_codes = {
HTTP_400_BAD_REQUEST: 'Bad Request'
}
Как отмечено в комментарии выше, serializer.is_valid()
всегда возвращает false с ошибкой:
{'event_detail': [u'Это поле не может быть пустым. ']}
Я понимаю, что это вызывает недовольство, поскольку необходимо создать как EventDetail
, так и Event
, чтобы отношения OneToOne былидобавил, но как вы справляетесь с этим с помощью Serializer, когда OneToOneField требуется, но еще не предоставлен клиентом?
Спасибо за yнаша помощь.
Отказ от ответственности: я использую Django 1.11