1

Я пытаюсь найти способ проверки того, существует ли данный идентификатор объекта в IntegerField (который используется для общих отношений в сериализаторе), например, для PrimaryKeyRelatedField.DRR-сериализатор с общим внешним ключом - проверьте, существует ли заданный идентификатор объекта до сохранения

До сих пор я пришел с этим подходом:
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 поле не подсвечивается. Интересно, есть ли для этого лучшее решение? Заранее спасибо!

P.S. Вот как это выглядит после отправки формы:

ответ

0

Я сделал это как-то - удален подклассы 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 

It now highlights the field но внешний вид отличается от для PrimaryKeyRelatedField. Я думаю, что есть некоторый код, который проверяет, откуда выбрано исключение, и если он из этого поля, то он показывает это по-другому, иначе он по умолчанию. Я не мог думать о другом объяснении этого поведения, потому что он поднимает то же самое ValidationError.

1

Пользователь 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." 
       } 
      }, 
     }