【问题标题】:One to One field causing integrity error on insert via admin一对一字段导致通过管理员插入时出现完整性错误
【发布时间】:2013-09-06 03:17:07
【问题描述】:

我正在尝试使用 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) 中。解决此问题的正确方法是什么?

【问题讨论】:

  • 这个字段address_id在哪里?

标签: python django postgresql django-admin


【解决方案1】:

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

除非是故意要求,否则您可以简单地使地址不是强制性的(空白=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,
)

【讨论】:

  • 感谢您的帮助。我最初在场地中设置了地址,但由于模型管理员中的内联,我会收到“地址没有场地的外键”类型错误。我不想让地址为空,因为我想确保所有场所都有地址。环顾网络,似乎我想做的事情做不到。我已经放弃了内联,这不是什么大不了的事,会很好的。
  • 这是可能的,但你需要测试它,因为它不是内置的 Django:gist.github.com/ramusus/4343464。在类似的情况下,我使用了表单集(不在管理员中......)。
  • 感谢您的链接,看起来很有希望
【解决方案2】:

改变这一行:

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

到这里:

venue = models.OneToOneField(Venue)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多