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

Python 一对一字段导致通过管理员插入时出现完整性错误,python,django,postgresql,django-admin,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

我试图使用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值违反了notnull约束,我认为这是由于将地址之前的地点插入数据库(postgres)。解决这个问题的正确方法是什么

为什么在地址中设置关系,而不是在场地中设置关系

除非是故意要求,否则您可以简单地将地址设置为非强制性(blank=True,null=True);此外,我更喜欢更明确的代码:

In address:

venue = models.OneToOneField(
    to=Address,
    to_field='id',
    related_name='address',
    blank=True,
    null=True,
)
在场地中为我设置它更有意义(您不需要在两种型号中都声明它):


为什么在地址中设置关系,而不是在场地中设置关系

除非是故意要求,否则您可以简单地将地址设置为非强制性(blank=True,null=True);此外,我更喜欢更明确的代码:

In address:

venue = models.OneToOneField(
    to=Address,
    to_field='id',
    related_name='address',
    blank=True,
    null=True,
)
在场地中为我设置它更有意义(您不需要在两种型号中都声明它):

更改此行:

venue = models.OneToOneField('clubApp.Venue')
为此:

venue = models.OneToOneField(Venue)
更改此行:

venue = models.OneToOneField('clubApp.Venue')
为此:

venue = models.OneToOneField(Venue)

此字段
地址\u id
在哪里?此字段
地址\u id
在哪里?谢谢您的帮助。我最初在场馆中设置了地址,但由于modeladmin中的内联线,我会得到一个“address has no foreign key to venture”类型的错误。我不想允许地址为空,因为我想确保所有场馆都有一个地址。环顾网络,我想做的事情似乎做不到。我已经放弃内联,这不是一个大交易,只是会很好。这是可能的,但您需要测试它,因为它不是内置的Django:。在类似的情况下,我使用了一个表单集(不是在管理中…)。谢谢你的链接,看起来很有希望获得帮助。我最初在场馆中设置了地址,但由于modeladmin中的内联线,我会得到一个“address has no foreign key to venture”类型的错误。我不想允许地址为空,因为我想确保所有场馆都有一个地址。环顾网络,我想做的事情似乎做不到。我已经放弃内联,这不是一个大交易,只是会很好。这是可能的,但您需要测试它,因为它不是内置的Django:。在类似的情况下,我使用了一个表单集(不是在管理中…),谢谢你的链接,看起来很有希望