自动添加对与父记录同时插入的外键的引用

时间:2011-12-26 17:44:29

标签: django

我在Django创建了一个客户数据库。每个客户可以有多个地址,客户记录指向其中一个地址作为帐单地址。这被设置为外键,每个地址都有一个指向拥有它的客户的外键。

当我们尝试创建新客户时会出现问题。新客户显然还没有任何地址,因此结算地址的下拉列表必须为空且不需要(或者更好,不存在)。它当然不应该显示或允许我选择其他客户的地址。

地址在客户管理页面上内嵌输入。

  1. 如何执行至少一个新客户创建的地址(或在编辑后至少以一个地址结束)?

  2. 我想要指定帐单邮寄地址,那么如何自动将帐单邮寄地址设置为与给定客户关联的第一个地址?如果地址被指示为帐单邮寄地址被删除,我还需要提出投诉。

  3. 如何才能在结算地址的下拉列表中显示当前客户的地址?我知道limit_choices_to选项,但不知道如何引用当前对象,因为据我所知,我需要在Customer类中声明billing_address列时使用limit_choices_toself未定义,因此我无法获取当前对象的主键。

  4. 这是我到目前为止的代码的简化版本:

    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 :(得分:0)

创建一个方法,监听您的客户模型的pre_save signal,检查是否输入了一个地址,如果只输入了一个,则将其设置为帐单地址;如果没有输入地址,则引发异常。

要仅显示相关的帐单邮寄地址,请使用ModelChoiceField,这会自动为您填写条目。