【问题标题】:Show two tables specific column data into one list?将两个表的特定列数据显示到一个列表中?
【发布时间】:2019-12-07 21:21:13
【问题描述】:

我有两个表 Customer 和 Subscription,其中 Customer 包含客户列表,Subscription 包含 Customer 和 Packages。 在客户列表中,我想显示每个客户有多少包裹。

订阅模式

class Subscription(models.Model):
    client = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True, related_name="subscriptions")
    package = models.ForeignKey(Package, on_delete=models.SET_NULL, blank=True, null=True)
    valid_start_date = models.DateTimeField()
    valid_end_date = models.DateTimeField()
    usage_count = models.IntegerField(null=True)
    status = models.CharField(max_length=20)
    transaction = models.BigIntegerField(blank=True, null=True, default=0)
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField()

客户模型

class Customer(AbstractBaseUser):
    first_name = models.CharField(max_length=250, blank=True, null=True)
    last_name = models.CharField(max_length=250, blank=True, null=True)
    email = models.EmailField(unique=True, blank=True, null=True)
    mobile_number = models.BigIntegerField(blank=True, null=True)
    password = models.CharField(max_length=1000, blank=True, null=True)
    gender = models.CharField(max_length=10, blank=True, null=True)
    profile_picture = models.ImageField(upload_to="user_data/profile_picture", blank=True)
    address = models.CharField(max_length=500, blank=True, null=True)
    country = models.ForeignKey(Countries, on_delete=models.SET_NULL, blank=True, null=True)
    state = models.ForeignKey(States, on_delete=models.SET_NULL, blank=True, null=True)
    city = models.ForeignKey(Cities, on_delete=models.SET_NULL, blank=True, null=True)
    pincode = models.IntegerField(blank=True, null=True)
    number_of_logins = models.IntegerField(blank=True, null=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(blank=True, null=True)
    updated_at = models.DateTimeField(blank=True, null=True)

    USERNAME_FIELD = "email"

预期结果:我想将订阅模型中的包字段数据显示到客户模型列表中。

  • 名称 - 没有。 - emaiId-pakages_subbed
  • customer1 - 手机 - 电子邮件 - package1,package2
  • customer2 - 手机 - 电子邮件 - package4,package1

实际结果:仅客户字段数据

【问题讨论】:

  • {{ customer.subscriptions.all|length }} 应该告诉你

标签: django python-3.x django-queryset


【解决方案1】:

您需要在查询集中使用annotate,就像here 一样

我认为

query = Customer.objects.annotate(subscription_count=Count('subscriptions'))

应该这样做(对于从此查询中检索到的任何对象,计数为 object.subscription_count

这只是一个数据库查询,只返回 Customer 对象,而 {{ customer.subscriptions.all|length }} 将是很多(并且可能还会检索所有订阅对象只是为了计算它们)。

如果您想要更多地访问 SubscriptionPackage 对象,您可以这样做

Subscription.objects.all().order_by("client__id", "package__name")... 

(我编了"package__name")这应该让您首先按客户分组订阅,然后按每个客户的包名称订购。

【讨论】:

  • 好的,我试过了,它确实显示了每个客户的订阅计数,但如果可能的话,我希望在一个查询集中包含客户列表的包名称。
  • 对客户的订阅是多对一的。您可以根据我的第二个建议查询由client__id 订购的订阅,并使用package__name 返回的订阅进行注释,但我认为您必须处理在代码中合并多个指向同一客户的订阅。我可能是错的,我不像一个数据库大师。您还可以使用选定的客户字段注释订阅以保存获取客户实例。
  • 我已经编辑了我的问题,并提到我希望我的列表应该达到预期的结果,你有想法如何实现那个特定的结果。
  • 如上。您将按顺序获得 4 个订阅的列表 (C1 P1) (C1 P2) (C2 P1) (C2 P4)。您必须处理在代码中将它们合并为 (C1 P1+P2) (C2 P1+P4) 的两个而不是四个操作(或咨询数据库专家),但您可以确定如果下一个订阅是指不同的客户,后续订阅不会引用已处理的客户。这个,或者只是选择客户,然后为每个客户迭代订阅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多