简体   繁体   中英

Django rest framework foreign key constraint fails creating model

I have the following in a Django Rest Framework setup:

models.py:

class Sku(BaseModel):
    sku_code = models.CharField(max_length=18, primary_key=True)
    supplier_id = models.PositiveIntegerField(db_index=True)
    soh = models.PositiveIntegerField(default=0)
    reserved = models.PositiveIntegerField(default=0)
    broken = models.PositiveIntegerField(default=0)
    unallocated = models.PositiveIntegerField(default=0)
    reorder = models.PositiveIntegerField(default=0)

class Reservation(BaseModel):
    sku = models.ForeignKey(Sku, db_column='sku_code')
    order_id = models.PositiveIntegerField(db_index=True)

serializers.py:

class SkuSerializer(serializers.ModelSerializer):
    class Meta:
        model = Sku
        fields = (
            'sku_code',
            'supplier_id',
            'soh',
            'reserved',
            'broken',
            'unallocated',
            'reorder',
            'created_at',
            'modified_at',
        )


class ReservationSerializer(serializers.ModelSerializer):
    sku = SkuSerializer(read_only=True)

    class Meta:
        model = Reservation
        fields = (
            'id',
            'order_id',
            'sku',
            'created_at',
            'modified_at'
        )

views.py:

class ReservationList(mixins.CreateModelMixin,
                      generics.GenericAPIView):

    queryset = Reservation.objects.all()
    serializer_class = ReservationSerializer

    def post(self, request, *args, **kwargs):
        sku = get_object_or_404(Sku, sku_code=request.data['sku_code'])
        request.data['sku'] = sku
        return self.create(request, *args, **kwargs)

Now when I post to the url linked to ReservationList.post view above I get the error: IntegrityError: (1048, "Column 'sku_code' cannot be null") .

It seems to be bypassing the serializers validation and failing on the database layer. For some reason it doesn't accept the SKU being passed in.

What am I doing wrong here? I have tried to follow the example at http://www.django-rest-framework.org/api-guide/relations/#nested-relationships but this seems to break down with the CreateModelMixin . I can't tell if there is something wrong with how my models or serializers are set up.

You've set the sku field to read only , that's why the serializer is ignoring it when you post.

From the relevant documentation

Read-only fields are included in the API output, but should not be included in the input during create or update operations. Any 'read_only' fields that are incorrectly included in the serializer input will be ignored.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM