两个QuerySet - 在第三个模型的公共外键上合并/连接

时间:2013-12-02 04:56:07

标签: django join django-queryset

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

价格 - 在QuerySet _prices:

id | provider | servicelevel | price | currency
1  | 1        | 1            | 10    | 1
2  | 1        | 1            | 20    | 2
3  | 2        | 2            | 15    | 1

持续时间 - 在QuerySet _duration中:

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'

我需要的是:价格+持续时间加入Servicelevel

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

2 个答案:

答案 0 :(得分:2)

  

我有两个QuerySet:一个是Price,另一个是Duration。在价格   QuerySet,有n个价格,每个价格都有一个Servicelevel。在里面   持续时间QuerySet,有n行Servicelevel唯一。我想要   将Duration QuerySet的数据添加到Price QuerySet

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

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)

答案 1 :(得分:0)

如果Duration和Servicelevel是一对一的,那么您可以重构数据模型。如果不是,您是否希望在最终报告中进行每一种排列?

查看_set“向后”关系经理:

https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward