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

时间:2009-07-28 18:34:22

标签: 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)

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

所以在我的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 个答案:

答案 0 :(得分: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)

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

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

 python manage.py syncdb

当您向模型添加新字段时,Django将自动向表中添加新列。

答案 1 :(得分:1)

您是否查看过使用Inlines的文档?

在您的admin.py

class Office(admin.TabularInline):
    model = Office

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