2016-11-30 2 views
0

У меня есть две модели Django (упрощенно):Джанго Rest Framework: Частичное обновление (PATCH) и внешние ключи

class Author(models.Model): 
    name = models.CharField() 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField() 

Для обеих моделей я использую основные ModelSerializers:

class AuthorSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = models.Author 
     fields = '__all__' 

[similar code for BookSerializer] 

Наконец, I» ве реализованы основные ModelViewSets:

class AuthorViewSet(viewsets.ModelViewSet): 
    queryset = models.Author.objects.all() 
    serializer_class = serializers.AuthorSerializer 

[similar code for BookViewSet] 

Теперь я частично обновить существующую книгу, оставляя «автора», так как он не должен изменение.

PATCH /api/v1/book/1/ 
JSON data: {'title': 'Lord of the Flies'} 

Я получаю эту ошибку:

HTTP 400 Bad Request 
Allow: GET, PUT, PATCH, DELETE, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    "author": [ 
     "This field is required." 
    ] 
} 

Я предполагаю, что это что-то делать с тем фактом, что «автор» является FK. Тем не менее я ожидал, что DRF справится с этим, сохранив связь объекта Book с целым и просто обновив заголовок.

Я ничего не могу найти об этом в документах или в других местах в Интернете. Мне что-то не хватает?

ответ

0

«автор» - обязательное поле, и вы не указали его в обновлении.

Либо используйте HTTP-протокол PATCH, чтобы обойти это ограничение или установить его как required=False.

+0

Я использую PATCH, это своего рода точка ... – Rik

+0

Тогда у вас может быть что-то в вашем коде или что вы не вставили это, чтобы это не произошло. Я не помню, что видел это, пока я использовал патч. – Linovia

+0

Вы правы. Как оказалось, в представлении mixin, которое я написал, была ошибка. – Rik