我在以下模型之间存在多对一关系
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)
假设我成功地将几个文章对象发送到数据库。我把这些物品和身份证
['1', '2', '3']
都在报道一个特定的故事。
我想通过POST方法为CreateAPIView视图创建一个故事,如下所示
POST http://127.0.0.1/news/story {articles': ['1', '2', '3']}
这是我的序列化程序
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')
这是我的观点
class StoryList(generics.ListCreateAPIView):
serializer_class = StorySerializer
queryset = Story.objects.all()
我想确保1)文章是存在的。2)在创建story对象之前更新文章故事。
假设我按原样运行它,我将得到以下错误:
在调用
Story.objects.create()
时遇到TypeError
。这可能是因为序列化程序类上有一个可写字段,该字段不是Story.objects.create()
的有效参数。您可能需要将该字段设置为只读,或覆盖StorySerializer.create()方法以正确处理此问题。
下面是重写create()方法的尝试:
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中有没有一种更干净/正确的方式来解决这样的用例?
谢谢
发布于 2018-06-14 09:48:12
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中的嵌套写入。
https://stackoverflow.com/questions/50847100
复制相似问题