gpt4 book ai didi

django - 在 Django Rest Framework 中发布外键关系

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

在我的 型号 ,我有以下类(class):

class Topic(models.Model):
name = models.CharField(max_length=25, unique=True)

class Content(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
topic = models.ForeignKey(Topic, blank=True, null=True)

我的 序列化程序 是这样的:
class TopicSerializer(serializers.ModelSerializer):
class Meta:
model = Topic
fields = ('name')

class ContentSerializer(serializers.ModelSerializer):
topic = TopicSerializer(read_only=True)
class Meta:
model = Content
fields = ('title', 'body', 'topic')

好的,所以在我的 中网址 文件,我有以下模式:
urlpatterns = [
...
url(r'^api/topic_detail/(?P<name>[a-zA-Z0-9-]+)/content_list/$', views.topic_content_list, name='topic_content_list'),
...
]

因此,当用户去说 /api/topic_detail/sports/content_list/ ,我们得到了所有主题为 的内容列表。体育 .现在我想要的是如果我们 发布 将以下数据添加到上述 URL,然后创建一个 Content 对象,其中包含自动与体育相关的主题字段。

我试图在我的 中按以下方式执行此操作浏览次数 :
@api_view(['GET', 'POST'])
def topic_content_list(request, name):
try:
topic = Topic.objects.get(name=name)
except:
return Response(status=status.HTTP_404_NOT_FOUND)

if request.method == 'GET':
contents = Content.objects.filter(topic=topic)
serializer = ContentSerializer(contents, many=True)
return Response(serializer.data)

elif request.method == 'POST':
request.data["topic"] = topic
serializer = ContentSerializer(data=request.data)
print request.data
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

现在让我们说我去 URL /api/topic_detail/sports/content_list/并发布这个:
{
"title": "My blog post",
"body" : ".....",
}

内容对象被创建,标题和正文字段设置正确。但是,主题字段设置为空。我怎样才能解决这个问题?任何帮助表示赞赏。

另外,请不要建议使用通用 View 集,因为我对自动发生的这么多事情感到不舒服。

编辑

好的,所以我修正了我愚蠢的错误:
class ContentSerializer(serializers.ModelSerializer):
topic = TopicSerializer(read_only=False)
class Meta:
model = Content
fields = ('title', 'body', 'topic')

也就是说,我将 read_only 参数设置为 False。但是,现在该帖子创建了一个新错误:
{
"topic": {
"non_field_errors": [
"Invalid data. Expected a dictionary, but got Topic."
]
}
}

我很确定这是指我发送的 data.website 不是 JSON,而是一个 Django 模型实例。如何对单个实例进行 JSONify?

最佳答案

这是来自您的序列化程序。

     topic = TopicSerializer(read_only=True)

这意味着您的主题是只读的,因此当您尝试保存序列化程序时,主题不会被保存。删除它,问题将得到解决。

编辑:

现在根据第二个错误,这是因为它需要一个 dict 并且您正在传递模型实例,因此您有两个选择。要么手动创建字典。
topic_dict = { "name": topic.name }
并将其作为 request.data 中的“主题”传递,然后保存或提供 topic_id,因为存在外键关系,它应该可以工作。

所以它会是这样的:
request.data["topic_id"] = topic.id

现在你选择做什么完全取决于你。

关于django - 在 Django Rest Framework 中发布外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001486/

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