如何在Django中管理多对一关系

5 投票
2 回答
4676 浏览
提问于 2025-04-15 13:13

我正在尝试建立一个多对一的关系,并希望能够通过管理面板来控制这个关系(比如添加、删除等)。所以这是我的 model.py 文件:

from django.db import models

class Office(models.Model):
    name = models.CharField(max_length=30)


class Province(models.Model):
    numberPlate = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)
    office = models.ForeignKey(Office)

我希望我的模型能够让一个省份拥有多个办公室。

所以在我的 admin.py 文件中:

class ProvinceCreator(admin.ModelAdmin):
        list_filter = ['numberPlate']
        list_display = ['name', 'numberPlate','office']

class OfficeCreator(admin.ModelAdmin):
        list_display = ['name']

我觉得这样写是对的,但是当我尝试通过管理面板添加一个新省份时,我遇到了这个问题:

TemplateSyntaxError at /admin/haritaapp/province/

Caught an exception while rendering: no such column: haritaapp_province.office_id

谢谢

2 个回答

1

你有没有查看过关于使用内联的文档呢?

在你的 admin.py 文件里

class Office(admin.TabularInline):
    model = Office

class ProvinceAdmin(admin.ModelAdmin):
    inlines = [
        Office,
    ]
6

看起来你的模型设置有点问题。如果你想让一个省有很多办公室,那么在办公室模型里应该把省作为外键。

from django.db import models

class Province(models.Model):
    numberPlate = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)

class Office(models.Model):
    name = models.CharField(max_length=30)
    province = models.ForeignKey(Province)

这样做是实现一对多关系的简单而直观的方法。

至于你遇到的错误“没有这个列:haritaapp_province.office_id”,当你在模型里添加一个新属性(在你的例子里是办公室)时,你需要手动把这个列添加到表里。或者你可以删除这个表,然后重新运行同步数据库的命令:

 python manage.py syncdb

Django 不会在你给模型添加新字段时自动把新列加到表里。

撰写回答