2017-12-12 16 views
1

을의 검색어 나는 다음과 같은 모델이 있습니다장고 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_name, department, positionend_datenull입니다 start_date와의 검색어에 주석을합니다. end_date이없는 UserCompany 개체가 하나 이상 있으면 걱정하지 않아도됩니다.

나는 아래와 같은 원시 SQL 하위 쿼리를 시도했지만 작동하는 것처럼 보였지만이 작업을 수행하는 효율적인 방법이 있는지 궁금하다. 원시 SQL을 사용하지 않고 이것을 작성해야한다. 나는 장고 1.11+에서 Subquery 표현이 있다는 것을 알고 있지만 사용중인 장고의 버전은 그것을 지원하지 않으며 나는이 순간에 업그레이드하고 싶지 않습니다.

내 솔루션 :

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') 
) 

내가 장고 1.9.8, 파이썬 2.7.13와 MySQL을 사용하고 있습니다. 감사!

+0

해당 회사 관련 필드는 무엇을 사용 하시겠습니까? –

+0

html 테이블에 사용자 데이터를 표시합니다. – Ivan

답변

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'외래 키 필드를 추가하고 모델 메서드에서이를 유지 관리해야합니다. 그런 다음 정상적인 장고 필터 등을 사용할 수 있습니다.