gpt4 book ai didi

python - Django Rest Framework-在POST上创建外键对象

转载 作者:行者123 更新时间:2023-12-03 09:59:25 24 4
gpt4 key购买 nike

我有一个简单的DRF REST API,我想用它来创建博客文章。我希望能够向这些博客文章添加标签,以便用户可以搜索标签并查看相关文章。但是,标签可能还不存在。我已经创建了一个带有ForeignKey字段的Article模型到Tag模型,如下所示:

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将其显示为一个下拉列表,其中填充了预先存在的标签:

DRF Interface

如何从 Tag API端点添加或创建多个 Article

编辑:根据要求,我已经添加了我的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中的序列化器。

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() 方法为

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

关于python - Django Rest Framework-在POST上创建外键对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53027705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com