【问题标题】:Issue with an endpoint - can't post - foreignkey option missing (DjangoREST)端点问题 - 无法发布 - 缺少外键选项(Django REST)
【发布时间】:2016-12-13 22:58:58
【问题描述】:

这就是我的用户 api 的样子:

{
"count": 1,
"next": null,
"previous": null,
"results": [
    {
        "id": 1,
        "username": "FOOBAR",
        "Todo_List": [
            {
                "url": "http://localhost:8000/todolist_api/1/",
                "default": true,
                "name": "Chores",
                "todos": [
                    {
                        "url": "http://localhost:8000/todos_api/1/",
                        "todolist_id": 1,
                        "name": "Laundry",
                    },
                    {
                        "url": "http://localhost:8000/todos_api/2/",
                        "todolist_id": 1,
                        "name": "Sweep floor",
                    }
                ]
            },
            {
                "url": "http://localhost:8000/todolist_api/2/",
                "default": true,
                "name": "Work",
                "todos": [
                    {
                        "url": "http://localhost:8000/todos_api/3/",
                        "todolist_id": 2,
                        "name": "Talk to Boss",
                    },
                    {
                        "url": "http://localhost:8000/todos_api/4/",
                        "todolist_id": 2,
                        "name": "Say Hello to Janitor",
                    }
                ]
            }
        ]
]
}

我有 3 个 API 端点:user_api、todolist_api 和 todos_api

我的 todos_api 有问题。我已经设置好了,所以当用户想要为特定的 todos_list 添加另一个 todo 时,他们必须使用 todolist 的 pk 和 todo 的名称向 todos_api 发送一个发布请求。

即:如果我想为“杂务”创建另一个 todo,我会向 todos_api 发送一个 post 请求,其中 todolist_id = 1,name = “Dust the computer”。 缺少 todolist_id 选项的问题。无论如何,当我发布帖子时,我收到错误消息说 todolist_id 不能为空。 我认为可能是因为存在外键关系。

这是我的 serializer.py

class TodoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Todo
        fields = ('url', 'todolist_id', 'name')

class TodoListSerializer(serializers.HyperlinkedModelSerializer):
    todos = TodoSerializer(many=True, read_only=True)

    class Meta:
        model = TodoList
        fields = ('url', 'default', 'name', 'todos')

class UserSerializer(serializers.HyperlinkedModelSerializer):
    Todo_List = TodoListSerializer(many=True, read_only=True)

    class Meta:
        model = User
        fields = ('id', 'username', 'Todo_List')

这是我的models.py

class TodoList(models.Model):
    default = models.BooleanField(default=False)
    owner = models.ForeignKey('auth.User', related_name='todolist')
    name = models.CharField(max_length=100, blank=True, default='')
    def __str__(self):
        return str(self.name+'-'+unicode(self.owner))

class Todos(models.Model):
    todolist = models.ForeignKey(TodoList, related_name='todolist_id', on_delete=models.CASCADE)
    owner = models.ForeignKey('auth.User', related_name='foobar')
    name = models.CharField(max_length=100, blank=True, default='')
    def __str__(self):
        return str(self.name)

如果有任何语法错误是由于我将我的实际 api 信息与 todo 和 todolist 交换以隐藏我的 api 的想法 [问题与语法无关]。

【问题讨论】:

    标签: python django api django-models django-rest-framework


    【解决方案1】:

    实际上,您不需要todolist_id,因为您可以从父数据中获取它。

    如果你真的不能没有,你应该修复序列化程序的创建/更新代码,以将父级的 todolist 作为参数传递给 todo 创建:

    Todos.objects.create(todolist=todolist, ...)
    

    【讨论】:

    • 我将如何从父数据中获取它?另外,我将如何制作一个采用该父数据的端点?这就是我的前端的结构: [todolist] --> [todolist1, todolist2, todolist3, addnewtodolist] --> 如果选择了 todolist,则列出的每个 todo 以及添加新 todo 的选项 [todo1 , todo2, todo3, addnewtodo] (这部分,addnewtodo 将有自定义的 todolist_id,从父数据中获取 - 它会向 todos_api 发送一个帖子 - 但 todos_api 只接受以下参数:name...跨度>
    • 一方面,您没有 3 个端点。你有一个嵌套数据。在序列化程序的创建/更新中,您创建对象并拥有对整个数据的完全访问权限,因此您可以获取 todolist 并将其传递给 Todo。
    • 嘿,谢谢,我决定使用 rest_framework_nested 让我的序列化程序接受 url slugs 作为参数。然后我做了你所说的改变序列化程序的创建/更新以利用新参数并且它起作用了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多