【发布时间】: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