2017-12-12 8 views
1

をクエリセットI以下のモデルがあります: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_namedepartmentpositionend_datenullあるstart_dateでクエリセットに注釈を付けるにしたいです。複数のUserCompanyオブジェクトがある場合は、end_dateがなくても問題ありません。いずれも問題ありません。

私は以下のような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を使用しています。ありがとう!

+0

これらの会社関連フィールドを使用するにはどうしますか? –

+0

ユーザデータをhtmlテーブルに表示する。 – Ivan

答えて

1

私のアドバイスは、独自のユーザーモデルを使用して、必要なプロパティを追加することです。これはおそらく最も有用なアプローチになります。私はおそらくcurrent_companyを通じて会社のものを参照するのではなく、ほとんどのユースケースのプロパティを追加すると思いますが

@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'外部キーフィールドを追加し、モデルメソッドでそれを維持します。その後、通常のジャンゴフィルターなどを使用することができます。

関連する問題