1

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

4

2 回答 2

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,
)
于 2013-09-03T05:57:43.750 回答
0

更改此行:

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

对此:

venue = models.OneToOneField(Venue)
于 2013-09-03T09:02:23.840 回答