2016-07-26 35 views
0

我有Django的REST框架如下设置:Django的REST框架外键 - NOT NULL约束失败

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

我是新来这个框架,所以我能以发布新事件用做分配给现有的设备

回答

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 
     } 
    ] 
} 
+0

谢谢你,这是一个很大的帮助!我还必须将此create()方法代码行更改为:'Values.objects.create(id_device = event.id_device,id_event = event,** value)' – limadelrey