Python Django REST框架外键-非空约束失败

Python Django REST框架外键-非空约束失败,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我在Django REST框架中有以下设置: 型号。py: class Device(models.Model): name = models.CharField() latitude = models.FloatField() longitude = models.FloatField() altitude = models.FloatField() class Event(models.Model): id_device = models.Forei

我在Django REST框架中有以下设置:

型号。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()
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')
序列化程序。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()
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:notnull约束失败:drf\u event.id\u device\u id


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

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

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\u device=event.id\u device,id\u event=event,**value)