类没有对类的外键

0 投票
1 回答
657 浏览
提问于 2025-04-18 18:10

我在Django中设置了我的模型,具体如下:

class Cities(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, unique=True)

    def __unicode__(self):
        return self.name


class Pincode(models.Model):
    id = models.AutoField(primary_key=True)
    pin = models.CharField(max_length=20, unique=True)

    def __unicode__(self):
        return self.pin


class Address(models.Model):
    id = models.AutoField(primary_key=True)
    build_add = models.CharField(max_length=255)
    street_add = models.CharField(max_length=255)
    area = models.CharField(max_length=255)
    city = models.ForeignKey(Cities)
    pin = models.ForeignKey(Pincode)

    def __unicode__(self):
        return self.area


class Classified(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    contact_person = models.CharField(max_length=300, blank=True)
    email = models.CharField(max_length=100, blank=True)
    address = models.ForeignKey(Address)
    subcategory = models.ForeignKey(Subcategory)
    area_code = models.CharField(max_length=10, blank=True,  default='')
    phone_number = models.BigIntegerField(max_length=20, default=0, blank=True)
    secondary_number = models.BigIntegerField(max_length=20, default=0, blank=True)
    more_numbers = models.CharField(max_length=300, default='', blank=True)
    image = S3DirectField(upload_to='s3direct', blank=True)
    secondary_image = S3DirectField(upload_to='s3direct', blank=True, default='')
    description = models.TextField(max_length=1000, blank=True)
    location = LocationField(blank=True, max_length=255)
    NO = 'NO'
    YES = 'YES'
    APPROVAL = ((NO, 'no'), (YES, 'yes'))
    active = models.CharField(choices=APPROVAL, default=NO, max_length=3)
    verified = models.CharField(choices=APPROVAL, default=NO, max_length=3)

我想问的是关于在管理后台中如何进行内联编辑,因为我需要在Classified的视图中编辑每个条目的数据。

我尝试了以下方法来在同一视图中编辑地址:

class AddressInline(admin.TabularInline):
    model = Address


class ClassifiedAdmin(admin.ModelAdmin):
    inlines = [AddressInline, ]
    search_fields = [
        'name',
    ]


admin.site.register(Classified, ClassifiedAdmin)

但是,这样做却出现了以下错误:

<class 'appname.models.Address'> has no ForeignKey to <class'appname.models.Classified'>

我该如何解决这个错误呢?我查看并尝试了<class>在Django中没有外键到<class>时的内联模型Django管理后台的内联:没有ForeignKey的解决方案,但对我来说似乎都不管用。

1 个回答

1

你的内联写反了。内联应该用在依赖的模型实例上。比如,你可以在一个 Address 中放一个 Classified,但反过来就不行,因为 Classified 是依赖于 Address 的,二者之间有外键关系。如果你有外键关系,其实可以用普通字段来代替,这样表单里就会出现一个下拉框,让你选择地址。如果你真的想让一个 Classified 对象出现在多个地址中,那就用 ManyToManyField,而不是 ForeignKey,这样 Django 会自动为你生成一个中间表。

另外,你的代码里不需要 AutoField 的那几行。Django 默认会生成一个名为 'id' 的自增主键。

撰写回答