在管理表单中设置默认帐单地址



我正在做一个Django项目,我有几个客户,每个客户都可以有多个邮政地址(办公室1、办公室2、办公室3…)。我必须为每个客户选择默认地址。

我创建了一个邮政地址模型,ForeignKey指向客户模型,在我的客户模型中,我输入了一个PositiveIntegerField来包含默认的邮政地址ID。问题是,我不知道如何在管理表单中只筛选与客户端相关的地址,并显示地址的描述,而不是PositiveIntegerField。

一些建议?

我创建了一个邮政地址模型,其中ForeignKey指向客户模型,在我的客户模型中,我输入了一个PositiveIntegerField以包含默认邮政地址ID。

不要那样做。这实际上是一种关系,因此您应该使用为此构建的工具:一个ForeignKey[Django-doc]。

因此,我们可以构建这样的东西:

class Customer(models.Model):
default_address= models.ForeignKey(
'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'].queryset= Address.objects.filter(
customer=self.instance
)
class Meta:
model = Customer

因此,在这里,我们将选项限制为属于客户的地址。

使用ForeignKey的优点是,数据库将保护引用完整性(id不能引用不存在的地址),此外,使用Django的ORM可以进行的所有高级查询在这里仍然是可能的。因此,您可以使用位于伦敦的default_addressCustomer进行筛选,例如使用类似Customer.objects.filter(default_address__city='London')的内容(给定地址具有city字段)。

最新更新