2011-01-05 1 views
0

У меня есть еще один вопрос Django/python. У меня есть models.py, которые выглядят примерно так.Вопрос Django о запросах

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 

Я знаю, что в Джанго, если я смотрю на {{invoices.client_contract_number }}, я получаю номер договора клиента. Но предположим, что я хотел узнать конкретный счет-фактуру, как бы я нашел имя клиента? Я не могу сделать {{invoice.name}}, потому что для клиента в счете-фактуре нет значения ключа foregin.

Edit: Вот мои взгляды

@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' 

ответ

2

Вы можете следить за отношениями через два присоединяется:

invoice.client_contract_number.client_number.name 

Кстати, ваши имена полех запутанные. client_contract_number - это не номер, это договор. И client_number также не является номером, это клиент. Просто позвоните им client_contract и client.

Edit после обновления вопрос

Я не уверен, что вы пытаетесь сделать здесь. invoices_list - это набор запросов всех счетов-фактур - очевидно, нет смысла спрашивать, что такое имя клиента для этого списка . Предположительно, что вы на самом деле хотите сделать, это перебирать - вероятно, в шаблоне - и распечатать имя для каждого из них:

{% for invoice in invoices_list %} 
    Client name: {{ client_contract_number.client_number.name }} 
{% endfor %} 
+0

'client_contract_number' выглядит как номер для меня. 'client_number' не работает. –

+0

@ Dominic Roger: Есть два поля, называемых 'client_contract_number'. Тот, что в модели 'Invoice' является ForeignKey, тот, что в' Contract' является целым числом. –

+0

Думаю, я пробовал что-то подобное раньше, но это не сработало. Я думаю, именно так я написал это в моих views.py. Что мне нужно в моих взглядах? – Shehzad009

0
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)) 

Вы не можете получить имя клиента из списка счетов-фактур. Есть ли какой-то конкретный счет, который вас интересует?

Если у вас есть экземпляр счета-фактуры, вы можете сделать invoice.client_contract_number.client_number.name. Но вы не можете сделать это в списке!

Кстати, если вы собираетесь пересекать несколько объединений, убедитесь, что ваш набор запросов содержит предложение select_related.

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

Это будет гарантировать, что только один большой запрос выполняется фронт, а не потенциально сотни, если вы перебор списка, а затем делают 3 реляционный запрос для каждого объекта. Каждый раз, когда у вас есть более 1 dot (счет-фактура - одна точка), настоятельно рекомендуем использовать select_related.

+0

В основном я хочу отобразить таблицу, в которой в одном столбце будет отображаться весь идентификатор счета. В другой колонке должно быть указано все имена клиентов. Однако правильный идентификатор счета должен совпадать с правильным именем клиента в той же строке. – Shehzad009

+0

@ Sheh Я понимаю, что вы пытаетесь сделать. Принятый ответ правильный. Вы должны получать имя клиента через счет-фактуру, охватывая несколько отношений, используя синтаксис точек. Это должно быть сделано в шаблоне. Не на ваш взгляд. Когда вы перебираете счета-фактуры, вам нужно извлечь этот атрибут имени клиента-фактур. Мой совет по select_related все равно хороший совет. Используйте select_related в вашем представлении и получите доступ к имени клиента в шаблоне. –