Dla uzupełnienia dodam implementację to_internal_value()
, ponieważ potrzebowałem tego w moim ostatnim projekcie.
Jak określić typ
Jest poręczny mieć możliwość rozróżniania różnych „klas”; Więc dodałem właściwość typu do bazy polimorficznych modelu do tego celu:
class GalleryItem(PolymorphicModel):
gallery_item_field = models.CharField()
@property
def type(self):
return self.__class__.__name__
Pozwala to nazwać type
jako „pole” i „tylko do odczytu pola”.
będzie zawierać nazwę klasy Python.
Dodawanie typu do serializer
Możesz dodać type
na „polach” i „tylko do odczytu pola” (trzeba określić typ pola we wszystkich Serializers chociaż jeśli chcesz ich używać we wszystkich Modele dla dzieci)
class PhotoSerializer(serializers.ModelSerializer):
class Meta:
model = models.Photo
fields = (..., 'type',)
read_only_fields = (..., 'type',)
class VideoSerializer(serializers.ModelSerializer):
class Meta:
model = models.Video
fields = (..., 'type',)
read_only_fields = (..., 'type',)
class GalleryItemModuleSerializer(serializers.ModelSerializer):
class Meta:
model = models.GalleryItem
fields = (..., 'type',)
read_only_fields = (..., 'type',)
def to_representation(self, obj):
pass # see the other comment
def to_internal_value(self, data):
"""
Because GalleryItem is Polymorphic
"""
if data.get('type') == "Photo":
self.Meta.model = models.Photo
return PhotoSerializer(context=self.context).to_internal_value(data)
elif data.get('type') == "Video":
self.Meta.model = models.Video
return VideoSerializer(context=self.context).to_internal_value(data)
self.Meta.model = models.GalleryItem
return super(GalleryItemModuleSerializer, self).to_internal_value(data)
nie mogę znaleźć żadnej dokumentacji na 'metody to_native'. Kiedy to się nazywa? –
http://www.django-rest-framework.org/topics/3.0-announcement/#changes-to-the-custom-field-api –
Zgaduję, że POST i PUT mogą być nieco trudniejsze (choć wciąż możliwe do wykonania), ponieważ musisz określić, co użytkownik chciał przesłać, PRZED sprawdzeniem poprawności (jeśli brakuje pola, może być niemożliwe uzyskanie pewności). IMHO, to czystsze używać oddzielnych punktów końcowych dla żądań zapisu. – WhyNotHugo