Django管理:ForeignKey的和ManyToManyField关系引用用户的订购(Djan

2019-07-19 11:32发布

我有一个应用程序,使得使用Django的UserProfile来扩展内置的Django User模型。 看起来有点像:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    # Local Stuff
    image_url_s = models.CharField(max_length=128, blank=True)
    image_url_m = models.CharField(max_length=128, blank=True)

    # Admin
    class Admin: pass

我添加了一个新的类来我的模型:

class Team(models.Model):
    name = models.CharField(max_length=128)
    manager = models.ForeignKey(User, related_name='manager')
    members = models.ManyToManyField(User, blank=True)

而且它注册到管理:

class TeamAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager')

admin.site.register(Team, TeamAdmin)

可惜的是,在管理inteface,当我去选择通过多选场的下拉框,或设置团队成员的经理,他们是由用户数字ID进行排序。 对于我的生活,我无法弄清楚如何获得这些排序。

我有一个类似的类:

class Meta:
    ordering = ['name']

这伟大工程! 但我不“拥有” User级的,当我尝试这一招在UserAdmin

class Meta:
    ordering = ['username']

我得到:

django.core.management.base.CommandError: One or more models did not validate: events.userprofile: "ordering" refers to "username", a field that doesn't exist.

user.username也不行。 我可以指定,像image_url_s如果我想。 。 。 我怎么能告诉管理员通过我的用户列表进行排序username ? 谢谢!

Answer 1:

一种方法是定义一个自定义窗体用于在管理你的团队模式,并覆盖manager字段中使用查询集与正确的顺序:

from django import forms

class TeamForm(forms.ModelForm):
    manager = forms.ModelChoiceField(queryset=User.objects.order_by('username'))

    class Meta:
        model = Team

class TeamAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager')
    form = TeamForm


Answer 2:

这个

class Meta:
    ordering = ['username']

应该

    ordering = ['user__username']

如果它在你的用户配置管理类。 这将停止例外,但我不认为它可以帮助你。

订购用户模型作为你的描述是相当棘手,但看到http://code.djangoproject.com/ticket/6089#comment:8寻求解决方案。



Answer 3:

这可能是危险的,由于某种原因,但可以在你的项目的一个行完成models.py文件:

User._meta.ordering=["username"]


Answer 4:

对我来说,唯一的工作解决方案是使用代理模式 。 如文档中所述,您可以创建自己的代理模型,甚至内置的模型和定制像普通机型事情:

class OrderedUser(User):
    class Meta:
        proxy = True
        ordering = ["username"]
    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

在此之后,在你的模型只是改变外键:

user = models.OneToOneField(OrderedUser, unique=True)

或甚至更合适的

user = models.OneToOneField(OrderedUser, unique = True, parent_link = True)


文章来源: Django Admin: Ordering of ForeignKey and ManyToManyField relations referencing User