2个查询集 - 合并/加入的第三个模式的共同外交重点(two QuerySets - merge/j

2019-10-30 01:42发布

我现在查询 - 相互独立 - 型号价格和持续时间(向下滚动模型定义)通过几个过滤器。 最后,我要合并的价格和持续时间的查询集,这样一个价格是与特定时间有关。 例:

价格 - 在查询集_prices:

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

持续时间 - 在查询集_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

Answer 1:

我有两个查询集:一价,且持续时间之一。 在价格查询集,有n每一个Servicelevel价格。 在持续的QuerySet,有n行与Servicelevel独特。 我想将时间查询集的数据添加到价格查询集

我想,因为这是用于显示目的,你需要调整你的数据:

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)


Answer 2:

如果持续时间和Servicelevel是一个对一个,那么你可以重构你的数据模型。 如果不是,你要在最终报告中的每个排列?

退房_set “落后”的关系经理:

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



文章来源: two QuerySets - merge/join on common foreign key of third model