外部キーではなく親モデルのいくつかの基準に基づいて既存のシリアライザにネストシリアライザを追加しようとしています。ユースケースは、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')
カスタムクエリーセット。おそらく、私はこれについて適切に考えていないと思います。リサーチモデルでは、何らかの形の「関係」フィールドが必要です。
親モデルから指定された値を持つフィルタから返されるすべての行の直列化リストをネストできますか?
:
次にこれであなたの
ResearchSerializer
を交換してください!私の多くの問題に対する答え。 –