1

外部キーではなく親モデルのいくつかの基準に基づいて既存のシリアライザにネストシリアライザを追加しようとしています。ユースケースは、Postgres ArrayFieldでフィルタリングすることによって識別される 'ResearchTemplate'オブジェクトの配列を持つ 'Research'オブジェクトを返すことです。それらをマッピングする外部キーがあるとき、私は、とそうすることができないネストシリアライザすることができましたDjango-Rest-Framework - ネストされたシリアライザとして無関係なモデルからクエリーセットをシリアライズする方法

モデル

 

class Research(TimeStampedModel): 
    category = models.CharField(max_length=100, choices=RESEARCH_TEMPLATE_CATEGORIES, default='quote') 
    body = models.CharField(max_length=1000, blank=True, default='') #The body of text comprising the nugget 
    additionaldata = JSONField(null=True) # all the varying values to be merged into a wrapper 

    def __str__(self): 
     return self.body 

    class Meta: 
     ordering = ('created',) 

class ResearchTemplate(TimeStampedModel): 
    template = models.TextField(blank=True, default='') 
    category = models.CharField(max_length=100, choices=RESEARCH_TEMPLATE_CATEGORIES, default='quote') 
    mergefields = ArrayField(models.CharField(max_length=200), blank=True) 

    def save(self, *args, **kwargs): 
     merges = re.findall("{{(.*?)}}", self.template) #get all the template names from within the mustaches 
     self.mergefields = list(set(merges)) #TODO: Make Unique 
     super(TimeStampedModel, self).save(*args, **kwargs) 

    def __str__(self): 
     return self.wrapper 

    class Meta: 
     ordering = ('created',) 

シリアライザ

 

class ResearchSerializer(serializers.ModelSerializer): 
     templates = ResearchTemplateSerializer(many=True) 

     class Meta: 
      model = Research 
      fields = ('id', 'created', 'speaker', 'body', 'templates') 

class ResearchTemplateSerializer(serializers.RelatedField): 
     def get_queryset(self, values): 
      return ResearchTemplate.objects.filter(mergefields__contained_by=['django']) #This must an array of keys from the Research object's JSON field 

     class Meta: 
      model = ResearchTemplate 
      fields = ('id', 'template') 

カスタムクエリーセット。おそらく、私はこれについて適切に考えていないと思います。リサーチモデルでは、何らかの形の「関係」フィールドが必要です。

親モデルから指定された値を持つフィルタから返されるすべての行の直列化リストをネストできますか?

答えて

8

DRFのSerializerMethodFieldhttp://www.django-rest-framework.org/api-guide/fields/#serializermethodfieldを使用できます。

ResearchTemplateSerializerを、通常のModelSerializerとして定義します。これは、RelatedFieldではありません。私は `SerializerMethodField()このため`感謝の認識していなかった

class ResearchSerializer(serializers.ModelSerializer): 
    templates = serializers.SerializerMethodField() 

    class Meta: 
     model = Research 
     fields = ('id', 'created', 'speaker', 'body', 'templates') 

    def get_templates(self, obj): 
     values = obj.get_values() # whatever your filter values are. obj is the Research instance 
     templates = ResearchTemplate.objects.filter(mergefields__contained_by=values) # Or whatever queryset filter 
     return ResearchTemplateSerializer(templates, many=True).data 
+0

次にこれであなたのResearchSerializerを交換してください!私の多くの問題に対する答え。 –

関連する問題