मैंने इस मुद्दे को थोड़ा अलग तरीके से हल किया है।
का उपयोग करना:
- डीआरएफ 3.5.x
- Django मॉडल-utils 2.5.x
मेरे models.py
देखो इस तरह:
class Person(models.Model):
first_name = models.CharField(max_length=40, blank=False, null=False)
middle_name = models.CharField(max_length=80, blank=True, null=True)
last_name = models.CharField(max_length=80, blank=False, null=False)
family = models.ForeignKey(Family, blank=True, null=True)
class Clergy(Person):
category = models.IntegerField(choices=CATEGORY, blank=True, null=True)
external = models.NullBooleanField(default=False, null=True)
clergy_status = models.ForeignKey(ClergyStatus, related_name="%(class)s_status", blank=True, null=True)
class Religious(Person):
religious_order = models.ForeignKey(ReligiousOrder, blank=True, null=True)
major_superior = models.ForeignKey(Person, blank=True, null=True, related_name="%(class)s_superior")
class ReligiousOrder(models.Model):
name = models.CharField(max_length=255, blank=False, null=False)
initials = models.CharField(max_length=20, blank=False, null=False)
class ClergyStatus(models.Model):
display_name = models.CharField(max_length=255, blank=True, null=True)
description = models.CharField(max_length=255, blank=True, null=True)
मूल रूप से - आधार मॉडल "व्यक्ति" मॉडल है - और एक व्यक्ति या तो पादरी, धार्मिक, या न ही हो सकता है और बस एक हो सकता है "व्यक्ति"। जबकि Person
के उत्तराधिकारी के विशेष संबंध भी हैं।
मेरी views.py
में मैं बहुत की तरह क्वेरीसमूह में उपवर्गों "इंजेक्षन" करने के लिए एक mixin का उपयोग: मैं जहां "आधार" PersonListSerializer घोषित
class PersonSubClassFieldsMixin(object):
def get_queryset(self):
return Person.objects.select_subclasses()
class RetrievePersonAPIView(PersonSubClassFieldsMixin, generics.RetrieveDestroyAPIView):
serializer_class = PersonListSerializer
...
और फिर असली "undry" भाग serializers.py
में आता है, लेकिन इसलिए जैसे उदाहरण के प्रकार के आधार पर विशेष serailzers वापस जाने के लिए to_representation
विधि ओवरराइड:
class PersonListSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
if isinstance(instance, Clergy):
return ClergySerializer(instance=instance).data
elif isinstance(instance, Religious):
return ReligiousSerializer(instance=instance).data
else:
return LaySerializer(instance=instance).data
class Meta:
model = Person
fields = '__all__'
class ReligiousSerializer(serializers.ModelSerializer):
class Meta:
model = Religious
fields = '__all__'
depth = 2
class LaySerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = '__all__'
class ClergySerializer(serializers.ModelSerializer):
class Meta:
model = Clergy
fields = '__all__'
depth = 2
"स्विच" मुख्य serializer की to_representation
विधि में क्या होता है (PersonListSerializer
)। यह इंस्टेंस प्रकार को देखता है, और उसके बाद आवश्यक धारावाहिक "इंजेक्ट करता है"। चूंकि Clergy
, Religious
सभी Person
से Person
वापस प्राप्त कर रहे हैं जो Clergy
सदस्य भी हैं, सभी Person
फ़ील्ड और सभी Clergy
फ़ील्ड लौटाते हैं। Religious
के लिए ही चला जाता है। और यदि Person
न तो Clergy
या Religious
है - आधार मॉडल फ़ील्ड केवल लौटाए जाते हैं।
सुनिश्चित नहीं है कि यह उचित दृष्टिकोण है - लेकिन यह बहुत लचीला लगता है, और मेरे उपयोगकेस फिट बैठता है। ध्यान दें कि मैं अलग-अलग विचार/धारावाहिकों के माध्यम से Person
को सहेज/अपडेट/बना सकता हूं - इसलिए मुझे इस प्रकार के सेटअप के बारे में चिंता करने की ज़रूरत नहीं है।
http://www.django-rest-framework.org/topics/3.0-announcement/#changes-to-the-custom-field-api –
क्या आपको अभी तक एक बेहतर समाधान मिला है? – eugene