Django 具有通用外键的DRF序列化程序-保存前检查给定对象ID是否存在

Django 具有通用外键的DRF序列化程序-保存前检查给定对象ID是否存在,django,django-rest-framework,django-generic-relations,Django,Django Rest Framework,Django Generic Relations,我试图找到一种方法来检查IntegerField中给定的对象ID是否存在,它在序列化程序中用于泛型关系,就像PrimaryKeyRelatedField一样 到目前为止,我采用了这种方法: models.py: class Comment(models.Model): person = models.ForeignKey(User, on_delete=models.CASCADE) text = models.TextField() created = models.D

我试图找到一种方法来检查IntegerField中给定的对象ID是否存在,它在序列化程序中用于泛型关系,就像PrimaryKeyRelatedField一样

到目前为止,我采用了这种方法: models.py:

class Comment(models.Model):
    person = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    content_type = models.ForeignKey(ContentType, limit_choices_to={'pk__in': CONTENT_TYPES_PK})
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
serializers.py:

class CommentSerializer(serializers.ModelSerializer):
    person = UserSerializer(read_only=True, default=serializers.CurrentUserDefault())
    content_type = serializer.PrimaryKeyRelatedField(queryset=ContentType.objects.filter(pk__in=CONTENT_TYPES_PK), write_only=True)
    object_id = IntegerField(write_only=True)

    class Meta:
        model = Comment
        extra_kwargs = {'created': {'read_only': True}}
        exclude = ('content_object',)

    def create(self, validated_data):
        obj = Comment(**validated_data)
        if not obj.content_object:
            raise serializers.ValidationError({'object_id': ['Invalid pk "'+str(obj.object_id)+'" - object does not exist.']})
        obj.save()
        return obj
但这并不是一种可靠的方法,因为它实际上不会引起字段错误——它只是模仿它,因此在API浏览器中字段不会突出显示。我想知道是否有更好的解决办法?提前谢谢

注意:提交表格后的情况如下:

我以某种方式将其删除了子类create方法,并添加了以下内容:

def validate(self, attrs):
    try:
        attrs['content_object'] = attrs['content_type'].model_class().objects.get(pk=attrs['object_id'])
    except:
        raise serializers.ValidationError({'object_id': ['Invalid pk "'+str(attrs['object_id'])+'" - object does not exist.']})
    return attrs

但外观与PrimaryKeyRelatedField的外观不同。我认为有一些代码可以检查异常抛出的位置,如果它来自该字段,那么它会以不同的方式显示,否则默认情况下会显示。我想不出对该行为的另一种解释,因为它会引发相同的ValidationError。

我以某种方式将其删除了子类create方法,并添加了以下内容:

def validate(self, attrs):
    try:
        attrs['content_object'] = attrs['content_type'].model_class().objects.get(pk=attrs['object_id'])
    except:
        raise serializers.ValidationError({'object_id': ['Invalid pk "'+str(attrs['object_id'])+'" - object does not exist.']})
    return attrs

但外观与PrimaryKeyRelatedField的外观不同。我认为有一些代码可以检查异常抛出的位置,如果它来自该字段,那么它会以不同的方式显示,否则默认情况下会显示。我想不出对这种行为的另一种解释,因为它会引发相同的ValidationError。

用户额外的\u kwargs简单且易于应用我正在共享请在序列化器字段后应用它

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = testModel
        fields = ('id','state','city','first_name',)
        extra_kwargs = {
            "state": {
                'allow_null': False, 'required': True,
                "error_messages" : {
                    "null" : "State is mandatory.",
                    "invalid": "State should be valid id",
                    "incorrect_type": "State should be valid id",
                    "does_not_exist": "State should be valid id",
                    "required":"State is mandatory.",
                    "blank":"State is mandatory."
                }
             },
         }

用户extra_kwargs简单且易于应用我正在共享请在序列化器字段后应用它

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = testModel
        fields = ('id','state','city','first_name',)
        extra_kwargs = {
            "state": {
                'allow_null': False, 'required': True,
                "error_messages" : {
                    "null" : "State is mandatory.",
                    "invalid": "State should be valid id",
                    "incorrect_type": "State should be valid id",
                    "does_not_exist": "State should be valid id",
                    "required":"State is mandatory.",
                    "blank":"State is mandatory."
                }
             },
         }