【问题标题】:Django REST Framework Foreign Key - NOT NULL constraint failedDjango REST Framework 外键 - NOT NULL 约束失败
【发布时间】:2016-07-26 16:12:06
【问题描述】:

我在 Django REST Framework 中有以下设置:

models.py:

class Device(models.Model):
    name = models.CharField()
    latitude = models.FloatField()
    longitude = models.FloatField()
    altitude = models.FloatField()

class Event(models.Model):
    id_device = models.ForeignKey(Device, related_name='events')
    name = models.CharField()
    date = models.CharField()
    time = models.CharField()

class Values(models.Model):
    id_device = models.ForeignKey(Device)
    id_event = models.ForeignKey(Event, related_name='values')
    x = models.FloatField()
    y = models.FloatField()
    z = models.FloatField()
    time = models.IntegerField()

serializers.py:

class DeviceSerializer(serializers.ModelSerializer):    

    events = EventSerializer(many=True)

    class Meta:
        model = Device
        fields = ('url', 'id', 'name', 'latitude', 'longitude', 'altitude', 'events')

    def create(self, validated_data):
        events_data = validated_data.pop('events')
        device = Device.objects.create(**validated_data)
        for event in events_data:
            Events.objects.create(device=device, **event)
        return device

class EventSerializer(serializers.ModelSerializer):

    values = ValuesSerializer(many=True)

    class Meta:
        model = Event
        fields = ('url', 'id', 'name', 'date', 'time', 'values')

    def create(self, validated_data):
        values_data = validated_data.pop('values')
        event = Event.objects.create(**validated_data)
        for value in values_data:
            Values.objects.create(event=event, **value)
        return event

class ValuesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Values
        fields = ('x', 'y', 'z', 'time')

当我尝试发布一个 事件 并使用这样的 JSON 文件分配一些 时:

{
    "name": "name_example", 
    "date": "date_example", 
    "time": "time_example", 
    "values": [
      {
        "x": 1, 
        "y": 2, 
        "z": 3, 
        "time": 1
      }, 
      {
        "x": 10, 
        "y": 20, 
        "z": 30, 
        "time": 2
      }, 
      {
        "x": 100, 
        "y": 200, 
        "z": 300, 
        "time": 4
      }
   ]
}

我收到错误IntegrityError: NOT NULL constraint failed: drf_event.id_device_id

我是这个框架的新手,所以我该怎么做才能发布新的事件,并将分配给现有的设备 ?

【问题讨论】:

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


    【解决方案1】:

    您的 EventSerializer 中没有指向设备的键。你错过了 id_device。

    class EventSerializer(serializers.ModelSerializer):
    
        values = ValuesSerializer(many=True)
    
        class Meta:
            model = Event
            fields = ('id_device', 'url', 'id', 'name', 'date', 'time', 'values')
    

    你需要在你的json中添加密钥:

    {
        "id_device": 1,
        "name": "name_example", 
        "date": "date_example", 
        "time": "time_example", 
        "values": [
          {
            "x": 1, 
            "y": 2, 
            "z": 3, 
            "time": 1
          }, 
          {
            "x": 10, 
            "y": 20, 
            "z": 30, 
            "time": 2
          }, 
          {
            "x": 100, 
            "y": 200, 
            "z": 300, 
            "time": 4
          }
       ]
    }
    

    【讨论】:

    • 谢谢,帮了大忙!我还必须将此 create() 方法代码行更改为:Values.objects.create(id_device=event.id_device, id_event=event, **value)
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2019-06-01
    • 2020-03-28
    • 2020-12-19
    • 2016-04-02
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多