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

5 python django django-models django-admin

我试图建立多对一的关系,并希望能够通过管理面板控制它(添加-remove等).所以这是我的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)
Run Code Online (Sandbox Code Playgroud)

我希望我的模型允许一个省有几个办公室.

所以在我的admin.py里面:

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

class OfficeCreator(admin.ModelAdmin):
        list_display = ['name']
Run Code Online (Sandbox Code Playgroud)

这似乎对我来说是正确的,但是当我尝试使用管理面板添加新的省时,我得到了这个:

TemplateSyntaxError at /admin/haritaapp/province/

Caught an exception while rendering: no such column: haritaapp_province.office_id
Run Code Online (Sandbox Code Playgroud)

谢谢

Ser*_*nko 6

它会让您的模型向后设置.如果您希望省有多个办公室,那么省应该是Office模型中的外键.

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)
Run Code Online (Sandbox Code Playgroud)

这将是实现一对多关系的直接且非常直观的方式

至于你得到的"没有这样的列:haritaapp_province.office_id"的错误,当你向模型中添加一个新属性(在你的案例办公室中)时,你应该手动将列添加到表中.或者删除表并重新运行syncdb:

 python manage.py syncdb
Run Code Online (Sandbox Code Playgroud)

向模型添加新字段时,Django 不会自动向表中添加新列.