Как применить мета-параметры модели Django к моделям, которые я не написал? - PullRequest
5 голосов
/ 06 апреля 2009

Я хочу применить мета-опцию "ordering" к пользователю модели Django из django.contrib.auth.models. Обычно я просто помещал бы класс Meta в определение модели, но в этом случае я не определял модель. Итак, куда мне поместить класс Meta для изменения модели User?

Ответы [ 4 ]

9 голосов
/ 06 апреля 2009

Вот как руководство Django рекомендует сделать это :

Вы также можете использовать прокси-модель для определения другого порядка по умолчанию для модели. Стандартная пользовательская модель не имеет определенного порядка (преднамеренно; сортировка стоит дорого, и мы не хотим делать это все время, когда выбираем пользователей). Возможно, вы захотите регулярно упорядочивать по атрибуту имени пользователя при использовании прокси. Это легко:

class OrderedUser(User):
    class Meta:
        ordering = ["username"]
        proxy = True

Теперь обычные запросы пользователей будут неупорядоченными, а запросы OrderedUser будут упорядочены по имени пользователя.

Обратите внимание, что для того, чтобы это работало, вам понадобится оформить сундук с Django, поскольку он довольно новый. Если у вас нет доступа к нему, вам нужно избавиться от прокси-части и реализовать ее таким образом, что может стать громоздким. Прочтите эту статью о том, как этого добиться.

6 голосов
/ 06 апреля 2009

Паоло ответ велик; Ранее я не знал о новой поддержке прокси. Единственная проблема заключается в том, что вам нужно нацелить ваш код на модель OrderedUser - что в некотором смысле похоже на простое выполнение User.objects.filter(....).order_by('username'). Другими словами, это менее многословно, но вам нужно явно написать свой код для его нацеливания. (Конечно, как уже упоминалось, вы также должны быть на транке.)

Мне кажется, что вы хотите, чтобы все User запросов были упорядочены, в том числе в сторонних приложениях, которые вы не контролируете. В таких обстоятельствах обезьяноподготовка базового класса относительно проста и очень маловероятна, чтобы вызвать какие-либо проблемы. В центральном месте (например, в файле settings.py) вы можете выполнить:

from django.contrib.auth.models import User
User.Meta.ordering = ['username']

ОБНОВЛЕНИЕ: Django 1.5 теперь поддерживает конфигурируемые пользовательские модели .

3 голосов
/ 06 апреля 2009

Пользователь может быть подклассом:

class OrderedUser(User):
    class Meta:
        ordering = ['-id', 'username']

Или вы можете использовать порядок в ModelAdmin:

class UserAdmin(admin.ModelAdmin):
    ordering = ['-id', 'username']

# unregister user since its already been registered by auth
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

Примечание. Метод ModelAdmin изменяет только порядок в администраторе, но не меняет порядок запросов.

0 голосов
/ 06 апреля 2009

Свяжитесь с автором и попросите его внести изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...