1

IntegerFieldのオブジェクトIDが存在するかどうかを調べる方法を探しています(シリアライザの汎用関係に使用されています)。 PrimaryKeyRelatedField
models.py:一般的な外部キーを持つDRFシリアライザ - 保存前に特定のオブジェクトIDが存在するかどうかを確認します。

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

シンプルで簡単に適用できます。共有しています。シリアライザフィールドの後に適用してください。

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." 
       } 
      }, 
     } 
関連する問題