Python Django ORM向用户注释当前公司queryset

Python Django ORM向用户注释当前公司queryset,python,django,django-orm,Python,Django,Django Orm,我有以下型号: 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.

我有以下型号:

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
对象

现在我想查询所有用户并用
公司名称
部门
职位
开始日期
对查询集进行注释,其中
结束日期
。如果有多个
UserCompany
对象没有
end\u date
我不在乎,任何一个都可以

我尝试了下面这样的原始sql子查询,它似乎很有效,但我想知道是否有更有效的方法来实现这一点,或者在没有原始sql的情况下编写它。我知道Django 1.11+中有
子查询
表达式,但是我使用的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”外键字段,并在model方法中维护它。然后,您可以使用普通的django过滤器等。

您打算使用这些公司相关字段做什么?在html表中显示用户数据。