我正在尝试根据父模型的某些条件(而不是外键)将嵌套的序列化程序添加到现有的序列化程序中 . 用例是返回一个'Research'对象,其中包含一系列'ResearchTemplate'对象,这些对象通过在postgres ArrayField上过滤来识别 .
Models
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',)
Serializers
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')
当有外键映射它时,我已经能够嵌套序列化器,但是无法使用自定义查询集 . 也许我没有正确地思考这个问题,我需要在研究模型上使用某种形式的“关系”字段 .
如何嵌套从过滤器返回的所有行的序列化列表,其中包含从父模型指定的值?
1 回答
您可以使用DRF的
SerializerMethodField
http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield .将
ResearchTemplateSerializer
定义为普通的ModelSerializer,而不是相关字段 .然后用这个替换你的
ResearchSerializer
: