1

IntegerField의 주어진 객체 ID가 존재하는지 확인하는 방법을 찾고 있습니다 (직렬 기의 일반 관계에 사용됨). PrimaryKeyRelatedField.일반 외래 키가있는 DRF 시리얼 라이저 - 저장하기 전에 주어진 객체 ID가 있는지 확인하십시오.

지금까지, 나는이 방법과 함께 :
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. 이것은 양식을 제출 한 후 같은 모습입니다 :

답변

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

사용자가 추가로 간단하고 쉽게 적용 할 수 있습니다. 공유하고 있습니다. 직렬화 필드 이후에 적용하십시오.

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." 
       } 
      }, 
     } 
관련 문제