django两个ForeignKeys到同一个模型 - 管理员错误

时间:2016-02-01 02:29:52

标签: python django

我有一个配置文件应用程序,它有一个名为profile的模型,我使用该模型来扩展django内置的用户模型,而无需对其进行子类化。

models.py

class BaseProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='owner',primary_key=True)
    supervisor = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='supervisor', null=True, blank=True)

@python_2_unicode_compatible
class Profile(BaseProfile):
    def __str__(self):
        return "{}'s profile". format(self.user)

admin.py

class UserProfileInline(admin.StackedInline):
    model = Profile

class NewUserAdmin(NamedUserAdmin):
    inlines = [UserProfileInline ]

admin.site.unregister(User)
admin.site.register(User, NewUserAdmin)

管理员

错误

<class 'profiles.admin.UserProfileInline'>: (admin.E202) 'profiles.Profile' has more than one ForeignKey to 'authtools.User'.

显然我想选择一个用户作为另一个用户的主管。我认为模型中的关系是可以的,那个抱怨的是admins.py文件。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这是我刚刚测试过的一个例子

class Task(models.Model):
    owner = models.ForeignKey(User, related_name='task_owner')
    assignee = models.ForeignKey(User, related_name='task_assigned_to')

在admin.py

class TaskInLine(admin.TabularInLine):
    model = User

@admin.register(Task)
class MyModelAdmin(admin.ModelAdmin):
    list_display = ['owner', 'assignee']
    inlines = [TaskInLine]

答案 1 :(得分:0)

您需要使用多个内联管理员。

如果您的模型具有多个ForeignKeys到同一个父模型,则需要在内联管理员中指定fk_name属性:

class UserProfileInline(admin.StackedInline):
    model = Profile
    fk_name = "user"

class SupervisorProfileInline(admin.StackedInline):
    model = Profile
    fk_name = "supervisor"

class NewUserAdmin(NamedUserAdmin):
    inlines = [UserProfileInline, SupervisorProfileInline]

Django有一些关于处理这个问题的文档:https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model