Я создал модель для почтовых адресов с 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
).