Django orm向用户询问当前的公司QuerySet



我有以下模型:

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向queryset注释,其中 end_datenull。如果没有end_date的一个以上的UserCompany对象,我不在乎,其中任何一个都很好。

我尝试了以下类似的RAW SQL子征,它似乎可以使用,但是我想知道是否有更有效的方法可以做到这一点,或者在没有RAW 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过滤器等。

最新更新