Django Rest Framework-更新视图中的ForeignKey字段条目



在我的Django Rest Framework项目中,我有两个模型之间的ForeignKey关系:

class Book(models.Model):
...
category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True)
...
class Category(models.Model):
name = models.CharField(max_length=100, blank=False)

如您所见,Book可以属于Category,但不必。这意味着"category"字段可能为null。因此,在我的views.py中,如果用户想将某个Book分配给特定的Category,则可以更新/修补任何Book实例。views.py更新方法如下所示:

class UpdateBooksCategory(generics.GenericAPIView):
'''
Class-based view to update the 'category' field of a Book instance.
'''
serializer_class = BookSerializer
permission_classes = [IsAuthenticated]
def patch(self, request,*args, **kwargs):
# get the Book instance first
book = Book.objects.get(pk=request.data.get('bookId'))
# if it is not assigned to a Category, then assign it
if book and not book.category:
book.category = Category.objects.get(name=request.data.get('categoryName'))
book.save()
serializer = self.get_serializer(book, context={"request": request})

return Response(serializer.data)

# otherwise, return a generic response
return Response({'response': "You have already put the selected Book in a Category."})

如果您可以看到,首先我会使用Book的ID获取用户想要更新的Book实例。如果其Category字段尚未填充,我会使用给定的类别名称获取一个Category实例并将其分配。

为了完整起见,下面是我的序列化程序类:

class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'name']

class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', /*some other fields*/,..., 'category']

所以,最后我的问题是:我想知道这是否是像这样更新ForeingKey字段的首选方式?我的意思是,看看基于UpdateBooksCategory类的视图,这是正确的方法吗?代码是有效的(我用PostMan测试了它(,但由于我是DRF的新手,我想知道这样的更新过程是否正确。

您可以更改BookSerializer:

class BookSerializer(serializers.ModelSerializer):
category_id = serializers.IntegerField(write_only=True)
category = CategorySerializer(read_only=True)
class Meta:
model = Book
fields = [
'id',
# some other fields,
'category',
'category_id',
]

category将是只读的嵌套数据,然后通过在请求中包含category_id来设置类别。

最新更新