Django: добавить ручной набор запросов к объекту набора запросов - PullRequest
0 голосов
/ 08 февраля 2019

Я использую Django 1.5 .

У меня есть таблица MultiUser

class MultiUser(models.Model):
    user = models.ForeignKey(User, related_name='owner_user')
    shared_user = models.ForeignKey(User, related_name='shared_user')
    access_level = models.CharField(
        default='Viewer',  
        max_length='100', 
        blank=True
    )

Эта таблица отображает пользователей с уровнем доступа нижевладелец пользователя.Поле user определяет пользователя-владельца, а shared_user - сопоставленного пользователя, который может быть либо manager , либо viewer

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

def getSharedUsers(self, user):
    # Get owner
    owner = None
    if self.filter(user=user).exists():
        owner = user
    elif self.filter(shared_user=user).exists():
        owner = self.filter(shared_user=user)[0]

    # Get all users
    shared_users = []
    if owner:
        shared_users = self.filter(user=owner)

    shared_users.append({
        'shared_user': owner,
        'access_level': 'OWNER',
        'created': owner.created
    })

    return shared_users

Поскольку пользователь-владелец не определил access_level в модели MultiUser .Я хочу вручную добавить пользователя-владельца в список наборов запросов с полем shared_user, установленным для пользователя-владельца, и access_level в качестве владельца .

Но это выдает ошибку как

'QuerySet' object has no attribute 'append'

Можно ли добавить созданный вручную объект в объект набора запросов?Если да, то как?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Здесь, когда вы используете shared_users = self.filter(user=owner), shared_users становится набором запросов.Что ж, если вы хотите добавить владельца в набор запросов, вы можете сделать это следующим образом:

from itertools import chain

shared_users = list(chain(shared_users, [{
    'shared_user': owner,
    'access_level': 'OWNER',
    'created': owner.created
}])

Но недостатком является то, что вы потеряете поддержку функциональности набора запросов.Поэтому вам нужно использовать его как список.

0 голосов
/ 08 февраля 2019

Вы видите, где смысл этого.

# Get all users
shared_users = []
if owner:
    shared_users1 = self.filter(user=owner)

shared_users.append({
    'shared_user': owner,
    'access_level': 'OWNER',
    'created': owner.created
})

return shared_users
...