【问题标题】:Django: append manual queryset to queryset objectDjango:将手动查询集附加到查询集对象
【发布时间】:2019-07-02 12:36:15
【问题描述】:

我正在使用 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 是映射用户,可以是 ma​​nagerviewer

我已经定义了一个模型管理器方法来获取所有用户的列表,包括所有者用户。

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

因为所有者用户没有在 MultiUser 模型中定义access_level。我想手动将所有者用户附加到查询集列表,其中 shared_user 字段设置为所有者用户,access_level 作为所有者

但这会产生错误

'QuerySet' object has no attribute 'append'

是否可以将手动生成的对象附加到查询集对象中?如果是怎么办?

【问题讨论】:

    标签: django django-1.5


    【解决方案1】:

    在这里,当您使用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
    }])
    

    但不利的一面是,您将失去查询集的支持功能。所以你需要像列表一样使用它。

    【讨论】:

    • 我可以在 Django REST Framework 序列化器中使用它吗?
    • 有没有办法伪造查询集来转换查询集中的字典对象?
    【解决方案2】:

    你知道这有什么意义。

    # 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
    

    【讨论】:

    • 为什么是shared_users1
    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 2012-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2012-05-19
    • 2018-03-10
    相关资源
    最近更新 更多