一对一字段通过管理员导致插入时出现完整性错误

时间:2013-09-03 01:53:27

标签: 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'中的'null值违反了非空约束',我认为是由于将地址插入数据库之前(postgres)。解决这个问题的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

为什么关系设定在地址而不是场地?

除非是故意的要求,否则你可以简单地使地址不是强制性的(空白=真,空=真);我也更喜欢更明确的代码:

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,
)

答案 1 :(得分:0)

更改此行:

venue = models.OneToOneField('clubApp.Venue')

对此:

venue = models.OneToOneField(Venue)
相关问题