Django REST Framework 3.0 - NOT NULL约束失败:

时间:2014-12-04 20:33:27

标签: python django rest django-rest-framework

我有这个错误

IntegrityError at /foobars/
NOT NULL constraint failed: restServer_foobar.geo_location_id

当我尝试通过http://127.0.0.1:8000/foobars/(网站/ APIView)向DB添加新的Foobar对象时

My Serializer Class如下所示:

class GeopointSerializer(serializers.ModelSerializer):

    class Meta:
        model = Geopoint
        fields = ('id', 'latitude', 'longitude')

class FooBarSerializer(serializers.ModelSerializer):

    geo_location = GeopointSerializer(required=True)

    class Meta:
        model = FooBar
        fields = ('id', 'geo_location', 'geo_fence', 'registered', 'last_login')

    def create(self, validated_data):
        geo_location_data = validated_data.pop('geo_location')
        foobar = FooBar.objects.create(**validated_data)
        Geopoint.objects.create(FooBar=foobar, **geo_location_data)
        return foobar

数据库已被删除。

1 个答案:

答案 0 :(得分:1)

您的ForeignKey模型上有FooBar,而不是Geopoint模型。这决定了创建对象所需的顺序,因为必须正确填充数据库中的字段。

具有外键的对象应始终在它们指向的对象之后创建,因为之后无法填充它 - 它必须在您创建对象时存在。在您的情况下,这意味着您必须切换create语句的位置,以便在Geopoint对象之前创建FooBar

def create(self, validated_data):
    geo_location_data = validated_data.pop('geo_location')
    geo_location = Geopoint.objects.create(**geo_location_data)
    foobar = FooBar.objects.create(geo_location=geo_location, **validated_data)
    return foobar

请注意构造每个对象的更改。