Автоматически добавлять ссылку на внешний ключ, вставленный одновременно с родительской записью - PullRequest
1 голос
/ 26 декабря 2011

Я делаю базу данных клиентов в Джанго. У каждого клиента может быть несколько адресов, и запись клиента указывает на один из этих адресов как адрес для выставления счета. Он настроен как внешний ключ, и каждый адрес имеет внешний ключ, указывающий на клиента, которому он принадлежит.

Проблема возникает, когда мы пытаемся создать нового клиента. У нового клиента, очевидно, еще нет адресов, поэтому раскрывающийся список для адреса выставления счета должен быть пустым и не обязательным (или, лучше сказать, отсутствующим). Это, конечно, не должно показывать или позволять мне выбирать адреса других клиентов.

Адреса вводятся на странице администратора клиента.

  1. Как я могу принудить по крайней мере один адрес, созданный с новым клиентом (или заканчивающийся по крайней мере одним адресом после редактирования)?

  2. Я хочу указать платежный адрес, так как я могу автоматически установить адрес выставления счета на первый адрес, связанный с данным клиентом? Мне также нужно будет подать жалобы, если адрес, указанный как адрес для выставления счета, будет удален.

  3. Как можно отобразить только адреса текущего клиента в раскрывающемся списке для адреса выставления счета? Я знаю опцию limit_choices_to, но не знаю, как ссылаться на текущий объект, учитывая, что, насколько я могу судить, мне нужно использовать limit_choices_to при объявлении столбца billing_address в классе Customer, где self isn я не могу получить первичный ключ текущего объекта.

Вот упрощенная версия кода, который у меня есть:

from django.db import models

class Address(models.Model):
    customer = models.ForeignKey("Customer")
    street = models.CharField(max_length=128)
    city = models.CharField(max_length=128)

    def __unicode__(self):
        return "%s, %s" % (self.street, self.city)

class Customer(models.Model):
    last_name = models.CharField(blank=True, max_length=64)
    first_name = models.CharField(blank=True, max_length=64)
    billing_address = models.ForeignKey("Address", null=True, blank=True, related_name="+")

    def __unicode__(self):
        return "%s %s" % (self.first_name, self.last_name)

1 Ответ

0 голосов
/ 27 декабря 2011

Создайте метод, который прослушивает сигнал pre_save для вашей модели клиента, который будет проверять, что был введен один адрес, и, если был введен только один, установите его как адрес для выставления счета; если адрес не был введен, вызвать исключение.

Чтобы показать только связанный адрес выставления счета, используйте ModelChoiceField , который автоматически отфильтрует записи для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...