Установите адрес для выставления счетов по умолчанию в форме администратора - PullRequest
0 голосов
/ 18 января 2019

Я работаю над проектом Django, где у меня есть несколько клиентов, каждый из которых может иметь несколько почтовых адресов (офис 1, офис 2, офис 3, ...). Я должен выбрать адрес по умолчанию для каждого клиента.

Я создал модель для почтовых адресов с ForeignKey, указывающей на модель клиента, и в своей модели клиента я ввел PositiveIntegerField, который будет содержать идентификатор почтового адреса по умолчанию. Проблема в том, что я не знаю, как фильтровать в форме администратора только адреса, относящиеся к клиенту, и показывать описание адреса вместо PositiveIntegerField.

Несколько советов?

1 Ответ

0 голосов
/ 18 января 2019

Я создал модель для почтовых адресов с ForeignKey, указывающим на модель клиента, и в моей модели клиента я ввел PositiveIntegerField, чтобы содержать идентификатор почтового адреса по умолчанию.

Не делай этого. На самом деле это отношение, поэтому вам следует использовать инструмент, созданный для этого: a ForeignKey [Django-doc] .

Таким образом, мы можем построить что-то вроде:

class Customer(models.Model):
    <b>default_address</b> = models.<b>ForeignKey</b>(
        'app.Address',
        on_delete=models.SET_NULL,
        null=True
    )

class Address(models.Model):
    customer = models.ForeignKey(
        Customer,
        on_delete=models.CASCADE,
        related_name='addresses'
    )

В ModelForm вы можете затем ограничить параметры адресами, которые принадлежат этому конкретному экземпляру. Например:

class CustomerModelForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(CustomerModelForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['default_address'].<b>queryset</b> = Address.objects.filter(
                customer=self.instance
            )

    class Meta:
        model = Customer

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

Преимущество использования ForeignKey состоит в том, что база данных будет защищать ссылочную целостность (идентификатор не может ссылаться на несуществующий адрес), и, кроме того, все расширенные запросы, которые вы можете выполнять с помощью ORM Джанго все еще возможно здесь. Таким образом, вы можете фильтровать Customer s с помощью default_address, который расположен в Лондоне, например, с чем-то вроде Customer.objects.filter(default_address__city='London') (если адрес имеет поле city).

...