如何注释特定的相关字段值

时间:2019-10-01 04:41:13

标签: sql django django-models django-select-related django-related-manager

我正在尝试优化一些代码。我有很多相关模型的模型,并且由于这些模型被设计为通用模型,因此我想对这些相关模型的特定类型的字段的值进行注释和过滤。我可以找到所需的相关模型类型的所有实例,或与父级相关的所有模型,但找不到与父级相关的特定类型的相关模型。有人可以建议吗?

我最初尝试过

parents = parent.objects.all()
parents.annotate(field_value=Subquery(related_model.objects.get(
                                     field__type='specific',
                                     parent_id=OuterRef('id'),
                                    ).value)))

但是出现错误This queryset contains a reference to an outer query and may only be used in a subquery。当我尝试

parents = parent.objects.all()
parents.annotate(field_value=Q(related_model.objects.get(
                              field__type='specific',
                              parent_id=F('id'),
                             ).value)))

我得到DoesNotExist: related_field matching query does not exist.,它看起来更近,但仍然无法正常工作。

模型结构:

class parent(models.Model):
    id = models.IntegerField(null=False, primary_key=True)

class field(models.Model):
    id = models.IntegerField(null=False, primary_key=True)
    type = models.CharField(max_length=60)

class related_model(models.Model):
    parent = models.ForeignKey(parent, on_delete=models.CASCADE, related_name='related_models')
    field = models.ForeignKey(field, on_delete=models.CASCADE, related_name='fields')

我想做的事甚至可能吗?

1 个答案:

答案 0 :(得分:0)

没关系,我决定进行反向查找,有点像

parent_ids = related_model.objects.filter(field__type='specific', parent_id__in=list_of_parents).values_list('parent_id')

parents.objects.filter(id__in=parents_id)