获取有关 1 QueryDjango 的所有信息

Get all information on 1 QueryDjango

我试图在单个查询集中获取所有值,我有以下模型:

class Temporal(model.Models):
   id = models.UUIDField(default=uuid.uuid4, primary_key=True)
   value=models.CharField(max_length=60)
   created_at = models.DateTimeField(auto_now_add=True)
   date_start = models.DateTimeField(auto_now_add=True)
   date_end = models.DateTimeField(auto_now_add=True)
   rate_name = models.ForeignKeyField("RateName")
   concept_payment = models.CharField(max_length=60)

   order = models.IntegerField(null=True, blank=True)

和其他一些领域...

我通过这种方式获得了所有差异concept_payment:

 energy_concepts = Temporal.objects.filter(rate_name=rate_name,
                                                  date_start__month__lte=month_apply,
                                                   date_end__month__gte=month_apply,
                                                   concept_payment='Energy').first()

demand_concepts = Temporal.objects.filter(rate_name=rate_name,
                                               date_start__month__lte=month_apply,
                                               date_end__month__gte=month_apply,
                                               concept_payment='Demand').first()

other_concepts = Temporal.objects.filter(rate_name=rate_name,
                                              date_start__month__lte=month_apply,
                                              date_end__month__gte=month_apply,
                                              concept_payment='Others').first()

taxes_concepts = Temporal.objects.filter(rate_name=rate_name,
                                              date_start__month__lte=month_apply,
                                              date_end__month__gte=month_apply,
                                              concept_payment='Taxes').first()

等等...唯一的区别是concept_payment,所以我想知道是否有办法把它们全部获取,使用注释而不是一个一个地获取,顺便说一句concept_payment sis dynamic 所以我想我必须首先了解所有不同的概念。 提前致谢。

任何方向或建议都会很有帮助,我主要担心的是每个过滤器都会访问数据库,我认为这不是很有效。

您可以使用 django 的 in_bulk 为您提供一个字典,其中 concept_payment 作为键,Temporal 实例作为值。

这会很棘手,因为每个 concept_type 可以有多个实例,但是由于您使用的是 postgres,并且您说 returned 哪个实例并不重要,那么您可以将 distinct 与 concept_payment 结合使用以删除重复项。

所以试试:

Temporal.objects.filter(
    rate_name=rate_name,
    date_start__month__lte=month_apply,
    date_end__month__gte=month_apply,
    concept_payment__in=['Taxes', 'Others', 'Demand', 'Energy'],
).distinct('concept_payment').in_bulk(field_name='concept_payment')

这应该return类似于:

{
    'Taxes': '<Temporal object with Taxes concept_type>',
    'Demand': '<Temporal object with Demand concept_type>',
    'Energy': '<Temporal object with Energy concept_type>',
    'Others': '<Temporal object with Others concept_type>',
}