В моем коде мне нужно создать пользовательский класс RelatedField
для нескольких ModelSerializer
классов. Я следовал за этим ответом , он отлично работает. Но мне нужно сделать несколько RelatedField
классов для каждой модели, которая у меня есть. Есть ли способ сделать только 1 RelatedField
класс, чтобы его можно было использовать для всех связанных полей в моем ModelSerializer
?
В настоящее время я делаю это так в serializers.py
:
class ColorRelatedField(serializers.RelatedField):
def display_value(self, instance):
return instance
def to_representation(self, value):
return str(value)
def to_internal_value(self, data):
return ColorParent.objects.get(name=data)
class ProductCollectionRelatedField(serializers.RelatedField):
def display_value(self, instance):
return instance
def to_representation(self, value):
return str(value)
def to_internal_value(self, data):
return ProductCollection.objects.get(name=data)
class ProductSerializer(serializers.ModelSerializer):
collection = ProductCollectionRelatedField(queryset=ProductCollection.objects.all(), many=False)
color = ColorRelatedField(queryset=ColorParent.objects.all(), many=False)
class Meta:
model = Product
fields = ['id', 'product_id', 'collection', 'color', 'video', 'status']
Как заставить to_internal_value
функцию возвращать динамическую c модель в зависимости от того, кто вызывает метод:
class CustomRelatedField(serializers.RelatedField, model):
def display_value(self, instance):
return instance
def to_representation(self, value):
return str(value)
def to_internal_value(self, data):
return model.objects.get(name=data)
class ProductSerializer(serializers.ModelSerializer):
collection = CustomRelatedField(model=ProductCollection, queryset=ProductCollection.objects.all(), many=False)
color = CustomRelatedField(model=ColorParent, queryset=ColorParent.objects.all(), many=False)
class Meta:
model = Product
fields = ['id', 'product_id', 'collection', 'color', 'video', 'status']
Когда я пытался добавить параметр model
в класс CustomRelatedField
, сообщение об ошибке У меня было:
имя model
не определено.