Python 一般关系中如何按外键过滤?

Python 一般关系中如何按外键过滤?,python,django,django-models,Python,Django,Django Models,以下是我的模型: class Model1(models.Model): ... distributor_links = GenericRelation(Relation, related_query_name="distributor_persons") class Model2(models.Model): ... distributor_links = GenericRelation(Relation, related_query_name="distri

以下是我的模型:

class Model1(models.Model):
    ...
    distributor_links = GenericRelation(Relation, related_query_name="distributor_persons")

class Model2(models.Model):
    ...
    distributor_links = GenericRelation(Relation, related_query_name="distributor_groups")

class Model3(models.Model):
    pass

class Relation(models.Model):
    link = models.ForeignKey(Model3)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
现在我想获取所有与Model3对象关联的
Model1
Model2
对象。我的查询如下所示:

Model1.objects.filter(distributor_links=self.object)
其中,
self.object
是一个
Model3
实例。 查询引发错误:
无法查询“查询”:必须是“关系”实例

我理解它为什么会抛出这个错误。这里的
distributor\u links=self.object
无法将
关系
对象与
Model3
对象进行比较,但我仍然不知道如何编写所需的查询。有什么想法吗?

可以解析对象的ContentType并使用它和对象id进行过滤

content_type = ContentType.objects.get_for_model(self.object)

Model1.objects.filter(distributor_links__content_type=content_type, distributor_links__object_id=self.object.id)

如果
self.object
Model3
实例,您可以:

Model1.objects.filter(distributor_links__link=self.object)
此静止类似于:

也就是说,新模型中字段的名称,后跟双下划线(_u),后跟字段的名称,依此类推,适用于您想要加入的任意多个模型


有关详细信息:

您已按self.object进行筛选。对象是什么?@kari antti,正如我所说的,对象是Model3I的一个实例,我想这比使用查找表达式要困难得多。这样行。谢谢