gpt4 book ai didi

python - Django ORM将当前公司注释给用户查询集

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:34 24 4
gpt4 key购买 nike

我有以下模型:

class UserCompany(models.Model):
user = models.ForeignKey(User)
company_name = models.CharField(max_length=200)
department = models.CharField(max_length=200)
position = models.CharField(max_length=200)
start_date = models.DateField()
end_date = models.DateField(null=True, blank=True)

单个用户可以拥有多个 UserCompany 对象。

现在我想查询所有用户,并使用 company_namedepartmentpositionstart_date 注释查询集其中 end_datenull。如果有多个没有 end_dateUserCompany 对象,我不在乎,其中任何一个都可以。

我尝试使用如下所示的原始 sql 子查询,它似乎有效,但我想知道是否有更有效的方法来执行此操作,或者在没有原始 sql 的情况下编写此操作。我知道 Django 1.11+ 中有 Subquery 表达式,但我使用的 Django 版本不支持它,我现在不想升级。

我的解决方案:

from django.db.models.expressions import RawSQL


def create_rawSQL(field):
return RawSQL(
"SELECT `myapp_usercompany`.`%s` FROM `myapp_usercompany` WHERE `myapp_usercompany`.`user_id` = `auth_user`.`id` AND `myapp_usercompany`.`end_date` IS NULL LIMIT 1" % field, ()
)

users = User.objects.all().annotate(
company_name=create_rawSQL('company_name'),
position=create_rawSQL('position'),
department=create_rawSQL('department'),
start_date=create_rawSQL('start_date')
)

我正在使用 Django 1.9.8、Python 2.7.13 和 MySQL。谢谢!

最佳答案

我的建议是使用您自己的用户模型并向其中添加您想要的属性。这可能是最有用的方法。这些属性看起来像这样:

@property
def current_company(self):
UserCompany.objects.filter(user=self, end_date=None).first()

@property
def company_name(self):
self.current_company.name

尽管我可能会通过 current_company 引用公司内容,而不是为大多数用例添加属性。

如果您确实需要完整的带注释的用户集并且有很多,我可能会向您的用户模型添加一个“current_company”外键字段并在模型方法中维护它。然后你可以使用普通的 django 过滤器等。

关于python - Django ORM将当前公司注释给用户查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47781196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com