Django 两个查询集-第三个模型的公共外键上的合并/连接

Django 两个查询集-第三个模型的公共外键上的合并/连接,django,join,django-queryset,Django,Join,Django Queryset,我现在通过几个过滤器独立地查询模型价格和持续时间(向下滚动模型定义)。最后,我想合并价格和持续时间查询集,以便一个价格与特定的持续时间相关联。例如: 价格-查询集价格: id | provider | servicelevel | price | currency 1 | 1 | 1 | 10 | 1 2 | 1 | 1 | 20 | 2 3 | 2 | 2 | 15

我现在通过几个过滤器独立地查询模型价格和持续时间(向下滚动模型定义)。最后,我想合并价格和持续时间查询集,以便一个价格与特定的持续时间相关联。例如:

价格-查询集价格:

id | provider | servicelevel | price | currency
1  | 1        | 1            | 10    | 1
2  | 1        | 1            | 20    | 2
3  | 2        | 2            | 15    | 1
持续时间-查询集中的持续时间:

id | servicelevel | country_in | country_out | duration | duration_details
1  | 1            | 83         | 236         | 5        | 'only on working days'
2  | 2            | 83         | 236         | 3        | 'Mon-Thu'
我需要的是:价格+服务级别的持续时间

id | provider | servicelevel | price | currency | duration | duration_details
1  | 1        | 1            | 10    | 1        | 5        | 'only on working days'
2  | 1        | 1            | 20    | 2        | 5        | 'only on working days'
3  | 2        | 2            | 15    | 1        | 3        | 'Mon-Thu'
我已经尝试了
annotate()
extra()
,但没有找到解决方案

型号:

class Price(models.Model):
    ...
    provider = models.ForeignKey(Provider)
    servicelevel = models.ForeignKey(Servicelevel)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    currency = models.ForeignKey('api.Currency')
    ...

class Servicelevel(models.Model):
    name = models.CharField(max_length=200)
    provider = models.ForeignKey(Provider)
    terms = models.TextField(blank=True)
    insurance = models.BooleanField(default=False)
    ...
class Duration(models.Model):
    servicelevel = models.ForeignKey(Servicelevel)
    country_out = models.ForeignKey('Country', related_name='duration_out_country_relation', null=True)
    country_in = models.ForeignKey('Country', related_name='duration_out_country_relation', null=True)
    duration = models.IntegerField()
    duration_details = models.TextField(blank=True)
    ...

KH

如果持续时间和服务级别是一对一的,那么您可以重构数据模型。如果不是,您是否希望最终报告中的每个排列

查看
\u set
“向后”关系管理器:


我有两个问题:一个是价格问题,另一个是工期问题。在价格上 QuerySet,有n个价格,每个价格有一个服务级别。在 Duration QuerySet,有n行具有唯一的服务级别。我想要 将持续时间查询集的数据添加到价格查询集

我认为,由于这是出于显示目的,您需要重新构造数据:

results = {}

for p in price_queryset:
   results.setdefault(p.pk, []).append(p)
   for d in duration_queryset.filter(servicelevel=p.servicelevel):
       results[p.pk].append(d)

我不确定我是否理解,如果您选择任何服务级别,您可以获得价格或持续时间。这是显示问题吗?例如,如果您有
p=Provider.objects.get(pk=1)
,则可以获取
p.servicelevel\u set.all()
,(此提供程序的所有服务级别),然后遵循关系。嗨,Burhan,在我想要遵循关系之前,我已经使用扩展筛选语句查询了持续时间,以确保一个服务级别只剩下一个持续时间。因此,您想从一个持续时间转到服务级别,然后再转到提供商?我有两个查询集:一个是价格,另一个是持续时间。在价格查询集中,有n个价格,每个价格有一个服务级别。在Duration QuerySet中,有n行的Servicelevel是唯一的。我想将持续时间查询集的数据添加到价格查询集,因此伪SQL将是“SELECT*FROM Price internal JOIN Duration ON Price.Servicelevel=Duration.Servicelevel”。但也许我的方法是错误的方向?你想对结果做什么?它只是为了打印还是其他什么?不幸的是,一个服务级别有n个持续时间(每个服务级别有不同的持续时间,取决于国家/地区\u in-country\u out排列)。在我的“从持续时间中选择”查询集中,我确保一个服务级别只显示一行。谢谢!你能告诉我怎样才能访问这些数据吗?当我尝试result['price']时,我得到“'int'对象没有属性'getitem'”结果是一个字典。键是价格项目的主键,值是列表。列表的第一个元素是价格项目本身,后面是与价格相同的服务级别的任何工期项目。