Django Rest Framework-在POST上创建外键对象 [英] Django Rest Framework - Create foreign key object on POST
问题描述
我有一个简单的DRF REST API,我想用它来创建博客文章.我希望能够向这些博客文章添加标签,以便用户可以搜索标签并查看相关文章.但是,标签可能还不存在.我已经创建了一个带有外键字段的 Article
模型,像这样的 Tag
模型:
I have a simple DRF REST API that I want to use to create blog articles. I want to be able to add tags to those blog articles so users can search tags and see related articles. However, the tags may not exist yet. I have created an Article
Model with a ForeignKey field to a Tag
Model like this:
class Tag(models.Model):
name = models.CharField(max_length=32)
def _str__(self):
return self.name
class Meta:
ordering = ('name',)
class Article(models.Model):
title = models.CharField(max_length=256)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
date = models.DateTimeField(auto_now_add=True)
tags = models.ForeignKey(Tag, on_delete=models.CASCADE, blank=True, default=None)
def __str__(self):
return self.title
class Meta:
ordering = ('date', 'id')
理想情况下,我想要的是能够使用一组标签发布新的 Article
,并且如果不存在任何标签,请在数据库中创建它们.但是,就目前而言,标记必须已经存在才能添加到 Article
中.在视觉上,DRF将其显示为一个下拉列表,其中填充了预先存在的标签:
Ideally what I want is to be able to POST a new Article
with a set of tags, and if any of the tags don't exist, create them in the DB. However, as it is currently, the tags need to already exist to be added to the Article
. Visually, DRF shows this as a dropdown that is populated with pre-existing tags:
如何从我的 Article
API端点添加或创建多个 Tag
?
How can I add or create multiple Tag
s from my Article
API endpoint?
根据要求,我添加了views.py
As requested, I've added my views.py
views.py:
from api.blog.serializers import ArticleSerializer, TagSerializer
from rest_framework import viewsets
# /api/blog/articles
class ArticleView(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
# /api/blog/tags
class TagView(viewsets.ModelViewSet):
queryset = Tag.objects.all()
serializer_class = TagSerializer
为完整起见,这是我的REST API的serializers.py中的序列化器.
For completeness, here are my serializers from my REST API's serializers.py.
serializers.py:
serializers.py:
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = '__all__'
urls.py:
from rest_framework import routers
router = routers.DefaultRouter()
router.register('articles', views.ArticleView)
router.register('tags', views.TagView)
urlpatterns = [
path('', include(router.urls)),
]
推荐答案
将序列化程序的 create()
方法覆盖为
Overriding the create()
method of the serializer as
class ArticleSerializer(serializers.ModelSerializer):
tags = serializers.CharField()
class Meta:
model = Article
fields = '__all__'
def create(self, validated_data):
tag = validated_data.pop('tags')
tag_instance, created = Tag.objects.get_or_create(name=tag)
article_instance = Article.objects.create(**validated_data, tags=tag_instance)
return article_instance
这篇关于Django Rest Framework-在POST上创建外键对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!