python - 一对一字段在通过管理员插入时导致完整性错误

标签 python django postgresql django-admin

我正在尝试使用 django 管理界面以单一形式插入地点和地址(1:1 映射)。

在我的模型中:

class Venue(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name


class Address(models.Model):
    states = {
        ...
    }
    countries = {
        ...
    }
    venue = models.OneToOneField('clubApp.Venue')
    address_line1 = models.CharField("Address line 1", max_length=50)
    address_line2 = models.CharField("Address line 2", max_length=50, blank=True)
    suburb = models.CharField("Suburb", max_length=40)
    state = models.CharField(max_length=3, choices=states)
    country = models.CharField(max_length=9, choices=countries)

    def __unicode__(self):
        return "%s %s, %s, %s, %s" % (self.address_line1, self.address_line2, self.suburb, self.state, self.country)

在我的 admin.py 中:

class AddressInline(admin.StackedInline):
    model = Address


class VenueAdmin(admin.ModelAdmin):
    inlines = [
        AddressInline
    ]

admin.site.register(Venue, VenueAdmin)

当我插入时出现完整性错误,“address_id”列中的“空值违反了非空约束”,我认为这是由于在地址之前将地点插入数据库 (postgres)。解决这个问题的正确方法是什么?

最佳答案

为什么关系设置在地址而不是 field ?

除非是有意要求,否则您可以简单地使地址不是强制性的(blank=True,null=True);我也更喜欢更明确的代码:

In address:

venue = models.OneToOneField(
    to=Address,
    to_field='id',
    related_name='address',
    blank=True,
    null=True,
)

对我来说,在 Venue 中设置它更有意义(您不需要在两个模型中都声明它):

address = models.OneToOneField(
    to=Venue,
    to_field='id',
    related_name='venue',
    blank=True,
    null=True,
)

关于python - 一对一字段在通过管理员插入时导致完整性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18582945/

相关文章:

html - Django webframework .css 和其他 .html 文件的相对路径

python - 如何使所有 python 导入/错误可见?

sql - 运算符不存在: integer = bigint[]

python进程间查询/控制

python - 消极的展望会产生意想不到的结果

python - 带有 WSDL 文件的 Spyne Soap 服务器

postgresql - CentOS 7 pg_upgrade 权限错误

python - 在 Python3 的线程池中退出无限循环的安全方法

python - 如何在html页面上添加注释

sql - 过去一年的 Postgresql 当前日期时间