【问题标题】:Python Get User Fullname From Foreign Key CustomerPython从外键客户获取用户全名
【发布时间】:2016-10-23 10:07:10
【问题描述】:

我想得到客户的全名,但最后我只得到了id。

orders = Order.objects.filter(restaurant=request.user.restaurant).order_by('customer__id').values('customer__id', 'customer__address', 'customer__avatar', 'customer').annotate(total_order= Count('customer__id'))

in value('customer') 我想得到客户全名,但我只得到 id。

from django.contrib.auth.models import User

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete= models.CASCADE, related_name= 'customer')
    avatar = models.CharField(max_length= 500)
    phone = models.CharField(max_length= 500, blank= True)
    address = models.CharField(max_length= 500, blank= True)

    def __str__(self):
        return self.user.get_full_name()

谢谢。

【问题讨论】:

  • 可以发下订单内容吗?
  • Id 客户姓名 客户头像 客户地址 总订单 {% for order in orders %} {{ order.customer__id}} {{order.customer}} {{order.customer__avatar}} {{order.customer__address}} {{order.total_order}} {% endfor %}
  • 订单型号
  • class Order(models.Model): customer = models.ForeignKey(Customer) restaurant = models.ForeignKey(Restaurant) driver = models.ForeignKey(Driver, blank= True, null= True) address = models.CharField(max_length= 500) total = models.IntegerField() status = models.IntegerField(choices= STATUS_CHOICES) created_at = models.DateTimeField(default= timezone.now) Pick_at = models.DateTimeField(blank= True, null= True ) def __str__(self): return str(self.id)
  • @VikoWijaya 您可以编辑原始问题以包含其他信息,而不是发布 cmets 或答案。

标签: python django django-queryset


【解决方案1】:

这就是valuesvalues_list 方法的工作原理。对于外键,它们返回 id(或外键指向的任何唯一字段)。我担心您要么需要单独获取用户对象,要么使用 .values(或 .prefetch_related)代替 .values

顺便说一句,.annotate 在传递给.values 的所有非注释字段上导致GROUP BY,在本例中为customer__addresscustomer__avatar

【讨论】:

  • 使用我的代码我已经可以显示我想要的,但不能显示全名。
  • 客户姓名地址总订单 abc abcabc 2 bbb bbbb 1 ccc cccc 1 类似的东西
  • 正如我所说,.values.values_list 不返回模型实例。只有原始值(外键字段的主键)。如果你想让它干净,你可以创建一个 get_user_full_name 函数,它接受一个用户或用户 ID 并返回用户的全名,并在你的视图和 Customer.__str__ 方法中重用该函数。
【解决方案2】:

如果我使用:

orders = Order.objects.select_related('customer').filter(restaurant= request.user.restaurant).annotate(total_order= Count('customer'))

变成这样,我想要pablo 1行但总订单是2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2011-02-24
    • 2019-05-03
    相关资源
    最近更新 更多