1

django 管理インターフェイスを使用して、会場と住所 (1: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 値が null 以外の制約に違反しています」という整合性エラーが発生します。これは、アドレスの前に会場をデータベース (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 に答える