繁体   English   中英

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

[英]One to One field causing integrity error on insert via 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)

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

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

除非有明确的要求,否则您可以简单地使地址不是必需的(空白= 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,
)

更改此行:

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

对此:

venue = models.OneToOneField(Venue)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM