关于查询集的Django问题
我还有一个Django/python问题。我有一个models.py,看起来像这样关于查询集的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
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()