2017-12-22 10 views
2

私のDjangoモデルでは、多対多の接続があります。私はまた、接続された診断から一次診断を選択するオプションを持っていたいと思います。多くの接続から多くの接続への選択フィールドの作成方法

class Case(models.Model): 
    diagnoses_all_icd_10 = models.ManyToManyField('ICD10') 

診断に関連する選択肢のみを表示する選択フィールドを作成する方法を教えてください。このソリューションはDjangoの管理者でも動作することが重要です。

答えて

1

私はthrough引数があなたのために働くと思います。あなたのケースでは

https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ManyToManyField.through

class Case(models.Model): 
    diagnoses_all_icd_10 = models.ManyToManyField(ICD10, through='DiagnoseOrder') 

class DiagnoseOrder(models.Model): 
    case = models.ForeignKey(Case, on_delete=models.CASCADE) 
    icd_10 = models.ForeignKey(ICD10, on_delete=models.CASCADE) 
    is_primary = models.BooleanField(default=False) 

    def save(self, *args, **kwargs): 
     # If not self.is_primary you won't need further query 
     if self.is_primary: 
      # Query if there is a primary order related to this case 
      existing_primary = DiagnoseOrder.objects.filter(is_primary=True, case=self.case).first() 
      if existing_primary: 
       # You can change existing primary's status *up to your need 
       existing_primary.is_primary = False 
       existing_primary.save() 
     super(DiagnoseOrder, self).save(*args, **kwargs) 

その後、あなたはDjangoの管理カスタマイズにInlineModelAdmin使用することができます。

さらに読書:

https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.StackedInline

https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.TabularInline

+0

は良い解決策のように見えます。接続の1つだけがis_primary = trueであることを保証する方法はありますか? –

+0

はい、リレーションモデルに保存前フックを追加できます。これは最適な解決策ではありませんが、Django管理者を使用する場合は、多くのオプションがありません。 –

+0

そして、私はちょうど私の答えに保存前フックの例を追加します。 –

関連する問題