定制订购django模型

时间:2017-03-21 13:39:23

标签: python django python-2.7 django-models django-admin

class MemberAdmin(CustomUserAdmin, admin.ModelAdmin):
    redirect_model_name = 'memberaccountproxy'
    change_form_template = 'loginas/change_form.html'
    list_display = ('username', 'email', 'first_name', 'last_name','country', 'gender',
                    'created_at', 'profile_pic')
    search_fields = ('username', 'first_name', 'last_name', 'email',)
    add_form = AccountProfileForm
    list_filter = (
        'gender', 'incomplete', 'email_verified', 'suspended',
        'deleted',
    )        
    # profile1 = None

    def get_queryset(self, objects):
        return Account.objects.filter(usertype=1)

    def country(self, obj):
        profile1 = Profile.objects.get(account=obj)
        if profile1.country:
            return profile1.country
        return ''
    country.admin_order_field = 'country'

我想要实现的目标是让我的会员列表页面上的国家列可以排序。(目前不是)

问题是我从方法 country 获取'obj'作为Account对象(在get_queryset()中定义),&后来我使用该obj获取另一个类型为Profile的对象(具有成员变量country)。但是当我尝试将country方法注册到'admin_order_field'时,它只能获取obj的成员变量(Account类型,其中没有国家/地区变量)。

是否有办法根据Profile类中的字段而不是Account来对国家/地区列进行排序。

class Profile(models.Model):
    account = models.OneToOneField(Account)
    country = models.ForeignKey('Country', null=True, blank=True, verbose_name='Country Living In', related_name='+')
    # name = models.CharField(max_length=40, blank=True)
    status = models.ForeignKey('Status', blank=True, null=True, verbose_name='Marital Status', related_name='+')
    btype = models.ForeignKey('Btype', blank=True, null=True, verbose_name='Body type', related_name='+')
    bheight = models.IntegerField(choices=HEIGHT, blank=True, null=True, verbose_name='Height')
    phystatus = models.ForeignKey('EthnicOrigin', blank=True, null=True, verbose_name='Ethnic Origin', related_name='+')
    createdby = models.ForeignKey('CreatedBy', blank=True, null=True, verbose_name='Profile Created By',
                                  related_name='+')
...........................


class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    usertype = models.IntegerField(default=1, choices=USER)
    username = models.CharField(max_length=40, unique=True)
    gender = models.CharField(choices=(('Male', 'Male'), ('Female', 'Female')), max_length=10, blank=True)
    phone = models.CharField(max_length=16, blank=True, verbose_name="Mobile No", null=True)


    temple = models.ManyToManyField('Account', blank=True, null=True, verbose_name="MatchMaker")
    first_name = models.CharField(max_length=40, blank=True, null=True)
    last_name = models.CharField(max_length=40, blank=True, null=True)
    acc_for = models.ForeignKey('CreatedBy', blank=True, null=True, verbose_name="Profile Created For")
    country_code = models.ForeignKey('CountryCode', max_length=40, blank=True, null=True)
............................................

1 个答案:

答案 0 :(得分:0)

list_displayadmin_order_field选项支持双下划线表示法来访问相关模型。

您的问题并不清楚,因为您还没有展示您的模型,但看起来您可以这样做:

country.admin_order_field = 'profile__country'

但是,您可以在country方法中将profile__country替换为list_display,并完全删除country方法。