2017-06-21 24 views
0

私はlegayデータベースで作業しているので、managed = Falseを設定する必要があります。つまり、データベーススキーマを更新できません。Djangoモデル - 別のテーブルを参照する外部キーを定義する方法?

私がしようとしているのは、プロジェクトIDに基づいてブランチを選択することです。理想的にはブランチテーブルでは、外部キーとしてproject_idを持つべきですが、以前のシステムデザインは別のテーブル(branches_projects)でこの関係を保存します。

私はhttps://docs.djangoproject.com/en/1.11/topics/db/sql/#django.db.models.Manager.rawを使用していくつかの問題を回避することができました。 raw()はRawQuerySetを返しますが、これは理想的ではありません。

私のブランチテーブルでは、project_idですが、ブランチのプロキシテーブルに参照/リンクする外部キーを定義する方法がありますか?

class Branches(models.Model): 
    name = models.CharField(max_length=128) 
    branchpoint_str = models.CharField(max_length=255) 
    dev_lead_id = models.IntegerField(blank=True, null=True) 
    source = models.CharField(max_length=255) 
    state = models.CharField(max_length=255) 
    kind = models.CharField(max_length=255) 
    desc = models.TextField(blank=True, null=True) 
    approved = models.IntegerField() 
    for_customer = models.IntegerField() 
    deactivated_at = models.DateTimeField(blank=True, null=True) 
    created_at = models.DateTimeField(blank=True, null=True) 
    updated_at = models.DateTimeField(blank=True, null=True) 
    codb_id = models.IntegerField(blank=True, null=True) 
    pm_lead_id = models.IntegerField(blank=True, null=True) 
    version = models.CharField(max_length=20, blank=True, null=True) 
    path_id = models.IntegerField(blank=True, null=True) 
    branchpoint_type = models.CharField(max_length=255, blank=True, null=True) 
    branchpoint_id = models.IntegerField(blank=True, null=True) 

    class Meta: 
     managed = False 
     db_table = 'branches' 
     verbose_name_plural = 'Branches' 

class Projects(models.Model): 
     id = models.AutoField(primary_key=True) 
     name = models.CharField(max_length=40, primary_key=True) 
     status = models.CharField(max_length=255) 
     platform = models.CharField(max_length=255) 
     enabled = models.IntegerField() 
     path = models.CharField(max_length=128, blank=True, null=True) 
     tag_prefix = models.CharField(max_length=64, blank=True, null=True) 
     created_at = models.DateTimeField(blank=True, null=True) 
     updated_at = models.DateTimeField(blank=True, null=True) 
     codb_id = models.IntegerField(blank=True, null=True) 
     template = models.CharField(max_length=64, blank=True, null=True) 
     image_path = models.CharField(max_length=128, blank=True, null=True) 
     repository_id = models.IntegerField(blank=True, null=True) 
     number_scheme = models.CharField(max_length=32) 
     special_dir = models.CharField(max_length=32, blank=True, null=True) 
     project_family_id = models.IntegerField() 
     class Meta: 
      managed = False 
      db_table = 'projects' 
      verbose_name_plural = 'projects' 

class BranchesProjects(models.Model): 
    # project_id = models.IntegerField() 
    # branch_id = models.IntegerField() 
    project = models.ForeignKey(Projects, on_delete=models.CASCADE) 
    branch = models.ForeignKey(Branches, on_delete=models.CASCADE) 

    class Meta: 
     managed = False 
     db_table = 'branches_projects' 

私の現在の生のクエリがモデルでは、この

SELECT br.id, br.name, br.created_at, br.updated_at, 
br.branchpoint_str, br.source 
FROM branches as br 
LEFT JOIN branches_projects as bp 
ON br.id = bp.branch_id 
WHERE bp.project_id = %s AND source != 'other' 
ORDER BY updated_at DESC 

答えて

0

私は最終的にそれが働いてんだ......

のようですが、私は次のように多対多を使用します。

class Branches(models.Model): 
name = models.CharField(max_length=128) 
project = models.ManyToManyField(Projects, 
    through='BranchesProjects', 
    related_name='project') 
branchpoint_str = models.CharField(max_length=255) 

その後、私の生のSQLと同じ結果を得るために、私は、次の手順を実行します。

def get_sb(project_id): 
    result = Branches.objects.filter(
     project=Projects.objects.get(id=project_id).id, 
     ).exclude(source='other').order_by('-updated_at') 
    print result.query 
    return result 
関連する問題