首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django DRF:使用PrimaryKeyRelatedFields列表发布到CreateAPIView

Django DRF:使用PrimaryKeyRelatedFields列表发布到CreateAPIView
EN

Stack Overflow用户
提问于 2018-06-14 06:20:26
回答 1查看 446关注 0票数 0

我在以下模型之间存在多对一关系

代码语言:javascript
复制
class Story(models.Model):

    id = models.CharField(max_length=12, primary_key=True)


class Article(models.Model):

    id = models.CharField(max_length=16, primary_key=True)
    title = models.CharField(max_length=500)
    address = models.URLField()

    story = models.ForeignKey(to=Story, blank=True, null=True, on_delete=models.CASCADE)

假设我成功地将几个文章对象发送到数据库。我把这些物品和身份证

代码语言:javascript
复制
['1', '2', '3'] 

都在报道一个特定的故事。

我想通过POST方法为CreateAPIView视图创建一个故事,如下所示

代码语言:javascript
复制
POST http://127.0.0.1/news/story {articles': ['1', '2', '3']}

这是我的序列化程序

代码语言:javascript
复制
class StorySerializer(serializers.ModelSerializer):

     id = serializers.ReadOnlyField()
     articles = serializers.PrimaryKeyRelatedField(many=True, allow_empty=False, queryset=Article.objects.all())

     class Meta:
         model = Story
         fields = ('id', 'articles')

这是我的观点

代码语言:javascript
复制
class StoryList(generics.ListCreateAPIView):

    serializer_class = StorySerializer
    queryset = Story.objects.all()

我想确保1)文章是存在的。2)在创建story对象之前更新文章故事。

假设我按原样运行它,我将得到以下错误:

在调用Story.objects.create()时遇到TypeError。这可能是因为序列化程序类上有一个可写字段,该字段不是Story.objects.create()的有效参数。您可能需要将该字段设置为只读,或覆盖StorySerializer.create()方法以正确处理此问题。

下面是重写create()方法的尝试:

代码语言:javascript
复制
    def create(self, validated_data):

        story_id = None

        for article_id in validated_data['articles']:
            article = Article.objects.get(id=article_id)
            story_id = article.story_id
            if story_id:
                break

        story = Story.objects.get(id=story_id) if story_id else Story.objects.create()

        for article_id in validated_data['articles']:
            article = Article.objects.get(id=article_id)
            article.story_id = story.id
            article.save()

        story.save()
        return story

    def update(self, instance, validated_data):
        return self.create(validated_data)

这里的想法是通过合并来确保没有重叠的故事。

当我尝试POST到此视图时,遇到Article.objects.get(id=article_id)行抛出的DoesNotExist

我的问题是

1) Minor :为什么我会得到这个错误

2)少校:在django中有没有一种更干净/正确的方式来解决这样的用例?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-06-14 09:48:12

代码语言:javascript
复制
class StoryList(generics.ListCreateAPIView):

    serializer_class = StorySerializer
    query_set = Story.objects.all()

应该是quertset而不是query_set

1) Minor :为什么我会得到这个错误

您提供了一个不存在的非法article_id。

2)少校:在django中有没有一种更干净/正确的方式来解决这样的用例?

drf-writable-nested可以很好地处理drf中的嵌套写入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50847100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档