Django Rest Framework-在POST上创建外键对象 [英] Django Rest Framework - Create foreign key object on POST

查看:57
本文介绍了Django Rest Framework-在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 Tags 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆