关于查询集的Django问题

关于查询集的Django问题,django,forms,views,models,django-queryset,Django,Forms,Views,Models,Django Queryset,我还有一个Django/python问题。我有一个models.py,看起来像这样 class Client(models.Model): client_number = models.PositiveIntegerField() name = models.CharField(max_length=80) address = models.CharField(max_length=250) telephone = models.CharField(max_length=20) fax

我还有一个Django/python问题。我有一个models.py,看起来像这样

class Client(models.Model):
 client_number = models.PositiveIntegerField()
 name = models.CharField(max_length=80)
 address = models.CharField(max_length=250)
 telephone = models.CharField(max_length=20)
 fax = models.CharField(max_length=20)
 email = models.EmailField()
 alternative_name = models.CharField(max_length=80, blank=True, null=True)
 alternative_address = models.CharField(max_length=250, blank=True, null=True)
 alternative_telephone = models.CharField(max_length=20, blank=True, null=True)
 alternative_email = models.EmailField(blank=True, null=True)
 def __unicode__(self):
         return unicode(self.client_number)

class Contract(models.Model):
 client_number = models.ForeignKey(Client)
 client_contract_number = models.PositiveIntegerField()
 start_date = models.DateField()
 end_date = models.DateField()
 contract_type = models.IntegerField(verbose_name = "Contract Types", choices = CONTRACT_TYPE_CHOICES) 
 contract_status =models.IntegerField(verbose_name = "Contract Status", choices = CONTRACT_STATUS_CHOICES) 
 exception = models.DecimalField(max_digits=5, decimal_places=2)
 uplift_percentage = models.DecimalField(max_digits=5, decimal_places=2)
 payment_day = models.DateField()
 payment_type = models.IntegerField(verbose_name = "Payment Type", choices = PAYMENT_TYPE_CHOICES)
 late_payment = models.IntegerField(verbose_name = "Late Payment Change", choices = LATE_PAYMENT_CHOICES) 
 late_payment_change_rate = models.DecimalField(max_digits=5, decimal_places=2)
 contract_value = models.DecimalField(max_digits=20, decimal_places=2)
 monthly_value = models.DecimalField(max_digits=20, decimal_places=2)

 def __unicode__(self):
         return unicode (self.client_contract_number)


    class Invoice(models.Model):
     transaction_type = models.IntegerField(verbose_name = "Transaction type", choices = TRANSACTION_TYPE_CHOICES) 
     invoice_number = models.CharField(max_length=16)
     date = models.DateField() 
     client_contract_number = models.ForeignKey(Contract)
     invoice_contact = models.CharField(max_length=80)
     invoice_net = models.DecimalField(max_digits=16, decimal_places=2)
     invoice_vat = models.DecimalField(max_digits=16, decimal_places=2)
     invoice_gross = models.DecimalField(max_digits=16, decimal_places=2)
     payment_date = models.DateField()
     special_notes = models.CharField(max_length=128)

     def __unicode__(self):
             return self.invoice_number
我知道在django,如果我查找
{{invoices.client\u contract\u number}
,我会得到客户合同号。但是如果我想知道某张发票,我该如何查找客户的姓名?我无法执行{{invoice.name},因为invoice中没有客户端的foregin键值

编辑: 以下是我的看法

@login_required
def homepage(request):
    invoices_list = Invoice.objects.all()
    invoice_name = invoices_list.client_contract_number.client_number.name
    return render_to_response(('index.html', locals()), {'invoices_list': invoices_list }, context_instance=RequestContext(request))
和错误

'QuerySet' object has no attribute 'client_contract_number'

可以跨两个联接跟踪关系:

invoice.client_contract_number.client_number.name

顺便说一句,您的字段名令人困惑<代码>客户\合同\编号不是数字,而是合同。而
客户号
也不是一个数字,它是一个客户。只要叫他们
client\u contract
client

问题更新后编辑

我不知道你想在这里做什么<代码>发票\u列表是所有发票的查询集-显然,询问该列表的客户名称没有意义。大概您真正想要做的是迭代-可能在您的模板中-并打印出每个模板的名称:

{% for invoice in invoices_list %}
    Client name: {{ client_contract_number.client_number.name }}
{% endfor %}
无法从发票列表中获取客户名称。有没有你感兴趣的发票

当您有一个发票实例时,您可以执行
invoice.client\u contract\u number.client\u number.name
。但你不能把它列在清单上

顺便说一下,如果要遍历多个联接,请确保查询集有一个
select\u相关的
子句

invoices_list = Invoice.objects.select_related(depth=3).all()

这将确保前面只执行一个大查询,而不是在遍历列表时可能执行数百个,然后对每个对象执行3个关系查询。任何时候你有1个以上的代码<代码> DOT/CUT>(CudiiC.Cube是一个点),强烈地考虑使用StReltType。

代码> CclipTunCurrTraceNo.<代码>看起来像个数字。“代码>客户号”没有。@Dominic Roger:有两个字段叫做
客户合同号”
发票
模型中的一个是外键,
合同
中的一个是整数。我想我以前尝试过类似的方法,但没有成功。我想这是我在我的观点中写的。在我的观点中我需要什么?@Shehzad009:你不需要任何东西,只需要我在上面发布的东西。如果你有一个特别的问题,请张贴你使用的代码和完整的回溯。好的,我想我终于找到了。但我希望它能通过我的代码实现。在我的视图中,我得到了这样的结果:“发票\名称=发票\列表[0]。客户\合同\编号。客户\编号。名称”。此外,我还使用了您的打印方法以及我的模板。基本上我想显示一个表格,其中一列将显示所有发票id。应该在另一列中显示所有客户的名称。但是,正确的发票id必须与同一行中正确的客户名称相匹配。@Sheh我理解您的意图。公认的答案是正确的。您应该使用点语法跨越多个关系,通过发票获取客户机名称。这应该在模板中完成。你不这么认为。在迭代发票时,需要提取发票客户机名称属性。尽管如此,我对select_相关的建议仍然是很好的建议。在视图中使用select_related,并在模板中访问客户端名称。
invoices_list = Invoice.objects.select_related(depth=3).all()