Django ORM将当前公司注释到用户查询集

时间:2017-12-12 20:41:51

标签: 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.DateField()
    end_date = models.DateField(null=True, blank=True)

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

现在,我想查询所有用户,并使用company_namedepartmentpositionstart_date end_date null UserCompany对查询集进行注释}。如果有多个end_date对象没有Subquery我不在乎,其中任何一个都没问题。

我尝试使用下面的原始sql子查询,它似乎工作,但我想知道是否有更有效的方法来做到这一点,或写这个没有原始的SQL。我知道Django 1.11+中有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版本不支持它,我现在不想升级。

我的解决方案:

// jpg file options
var jpgFile = new File(myfilePath);
jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE;
jpgSaveOptions.embedColorProfile = true;
jpgSaveOptions.matte = MatteType.NONE;
jpgSaveOptions.quality = 40;

activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE);

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

1 个答案:

答案 0 :(得分:1)

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

@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过滤器等。