Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django中使用foreignkey创建新模型_Python_Django - Fatal编程技术网

Python 如何在django中使用foreignkey创建新模型

Python 如何在django中使用foreignkey创建新模型,python,django,Python,Django,这些是我的模型。我正在尝试创建一个新的ScheduleDefinition(Schedule已存在,并且我知道要用于外键的ID)。我有一个预定义的计划id要使用,但它不起作用 发布此正文: class Schedule(models.Model): name = models.CharField(max_length=50) class ScheduleDefinition(models.Model): schedule = models.ForeignKey(Schedul

这些是我的模型。我正在尝试创建一个新的
ScheduleDefinition
Schedule
已存在,并且我知道要用于外键的ID)。我有一个预定义的计划id要使用,但它不起作用

发布此正文:

class Schedule(models.Model):
    name = models.CharField(max_length=50)


class ScheduleDefinition(models.Model):
    schedule = models.ForeignKey(Schedule, on_delete=models.DO_NOTHING)
    config = JSONField(default=dict, blank=True)
我得到的错误是:
schedule\u id列中的null值违反了非null约束

我做错了什么?当我创建新的
ScheduleDefinition
模型时,
Schedule
模型以前已经创建过了。当我创建新的
计划定义时,我永远不会创建新的
计划

序列化程序:

{
    "schedule_id": 1,
    "config": {
        "CCC": "ccc"
    }
}
视图:

查看错误:

from rest_framework import generics
from .models import Schedule, ScheduleDefinition
from .serializers import ScheduleSerializer, ScheduleDefinitionSerializer


class ScheduleList(generics.ListAPIView):
    queryset = Schedule.objects.all()
    serializer_class = ScheduleSerializer


class ScheduleDefinitionList(generics.ListCreateAPIView):
    queryset = ScheduleDefinition.objects.all()
    serializer_class = ScheduleDefinitionSerializer


class ScheduleDefinitionDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = ScheduleDefinition.objects.all()
    serializer_class = ScheduleDefinitionSerializer

您已按要求指定了计划(非空),但实际上并没有向其发布任何信息。当前序列化程序需要以下格式的信息:

File "/app/server/schedules/serializers.py", line 13, in ScheduleDefinitionSerializer
   schedule_id = serializers.PrimaryKeyRelatedField(source="schedule")
File "/usr/local/lib/python3.7/dist-packages/rest_framework/relations.py", line 247, in __init__
  super().__init__(**kwargs)
File "/usr/local/lib/python3.7/dist-packages/rest_framework/relations.py", line 108, in __init__
    'Relational field must provide a `queryset` argument, '
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.
schedule\u id
在您发布时将被丢弃。此外,您还指定了
schedule
是一个只读字段,这意味着即使您发布了一个计划,它仍然会被丢弃

如果您想发布到外键,您需要通过手动编写的创建/更新逻辑来专门处理它(这可能有点麻烦),或者使用不同的(可写的)外键字段序列化程序并以另一种方式序列化其他只读数据

例如,以下设置应适用于(未测试)您当前试图发布的数据:

类ScheduleDefinitionSerializer(serializers.ModelSerializer):
schedule=serializers.PrimaryKeyRelatedField(
queryset=Schedule.objects.all()
)
schedule\u name=serializers.CharField(只读=True,source=“schedule.name”)
类元:
模型=调度定义
字段=['schedule','schedule_name','config']
有了这个功能,您的帖子应该可以正常工作,并且您仍然可以通过列表/详细信息视图中的
schedule\u name
字段以只读方式访问相应的计划名称


编辑 我的早期版本的代码可能与原始所需的POST数据不兼容。以下内容应在不改变职位的情况下起作用

类ScheduleDefinitionSerializer(serializers.ModelSerializer):
schedule=ScheduleSerializer(many=False,read_only=True)
schedule_id=serializers.PrimaryKeyRelatedField(
source=“时间表”,
queryset=Schedule.objects.all()
)
类元:
模型=调度定义
字段=['schedule','schedule_id','config']

你能分享你正在使用的序列化程序(和视图)吗?@WillemVanOnsem updated@WillemVanOnsem我已将只读设置为true,因为
ScheduleDefinition
模型将永远不会创建新的
Schedule
模型。我认为您需要指定
字段=['Schedule\u id','config']
失败,并出现相同问题@WillemVanonSem使用您的方法获得与上述相同的错误,将
{“schedule_id”:1,“config”:{“BBB”:“BBB”}}
作为我的post数据传入。我的
schedule
模型预先填充了数据。决不能将其添加到、编辑或从中删除。它只是不同的日程类型(每月、每日、每周等),这就是为什么我将其设置为只读的原因。基本上,我只需要弄清楚如何将特定的计划类型发布到我正在创建的新计划定义中。删除发布数据中的_id:`{“schedule”:1,“config”:{…}`注意,在示例代码中,我告诉序列化程序我们正在更改“计划”字段仅为PrimaryKeyRelatedField完全按照您所说的那样,在“schedule\u id”列中获取相同的错误
null值违反了非null约束
。尽管我必须添加
schedule=serializers.PrimaryKeyRelatedField(read\u only=True)
,否则我的视图会出错
File "/app/server/schedules/serializers.py", line 13, in ScheduleDefinitionSerializer
   schedule_id = serializers.PrimaryKeyRelatedField(source="schedule")
File "/usr/local/lib/python3.7/dist-packages/rest_framework/relations.py", line 247, in __init__
  super().__init__(**kwargs)
File "/usr/local/lib/python3.7/dist-packages/rest_framework/relations.py", line 108, in __init__
    'Relational field must provide a `queryset` argument, '
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.
{
    "schedule": {
        "name": "Foo" 
    },
    "config": {...}
}