Django Queryset to List преобразование => Потеря данных? - PullRequest
1 голос
/ 24 августа 2010

Я пытаюсь заполнить список, основанный на элементарных участниках, но он, похоже, не собирается планировать.

user = request.user
    members = [] 
    userprofile = user.get_profile()
    if user.is_superuser or user.is_staff:
        if userprofile.countries.count() == 0:
            members = Member.objects.all()
        elif userprofile.countries.count() >0:
            for c in userprofile.countries.all():
                m1 = Member.objects.filter(location__country = c)
                members.append(m1)
        else:
            pass

    self.fields['members'].choices = [(member.id, member.display_name()) for member in members]

Здесь мы видим self.fields (это множественный выборbox) имеет member.id.Я пробовал и этот, и member.pk, но, похоже, он не работает => Django сообщает, что у участника нет атрибутов с именами id или pk

Если пользователь является суперпользователем и имеет количество стран0, то работает нормально;Так что я знаю, что это связано с функцией добавления под вызовом queryset.

Может ли кто-нибудь предложить какие-либо подсказки относительно того, почему id / pk недоступен / потерян после добавления результатов в список?Кроме того, кто-нибудь знает об обходном пути?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Я думаю, что ваша проблема в том, что Member.objects.filter(location__country = c) собирается вернуть объект QuerySet ... который по сути является ловушкой для выполнения запроса (лениво) после его оценки. если вы измените это значение на list(Member.objects.filter(location__country = c)), оно будет немедленно оценено и вернет вам список экземпляров модели Member вместо объекта QuerySet.

1 голос
/ 08 декабря 2011

Есть пара проблем с вашим кодом.Во-первых, Member.objects.filter (location__country = c) возвращает набор запросов.Набор запросов не оценивается при добавлении к членам (см. https://docs.djangoproject.com/en/1.3/ref/models/querysets/#when-querysets-are-evaluated). Во-вторых, даже если вы оцените набор запросов, как предполагает Мэтью, члены будут списком списков, а не простым списком, как ожидает ваш код.код вместо:

if user.is_superuser or user.is_staff:
    if not userprofile.countries.count():
        members = Member.objects.all()
    else:
        members = Member.objects.filter(location__country__in=userprofile.countries.all())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...