2017-12-23 14 views
0

他のForeignKeyに基づいてForeignKeyのオプションをフィルタリングする必要があります。他のForeignKeyに基づいてForeignKeyのオプションをフィルタリングする方法

class LabValue(models.Model): 

    measurement = models.ForeignKey(
     'LabMeasurement', on_delete=models.CASCADE) 


    unit = models.ForeignKey(
     LabMeasurementUnit, 
     on_delete=models.CASCADE, 
     limit_choices_to={'parameter__id': self.measurement.parameter.id}, 
    ) 

self.measurement.parameter.idはどのように取得できますか?たとえば "1"のようにself.measurement.parameter.idの代わりにIDを手動で入力すると、クエリが機能します。

def __str__(self): 
     return str(self.measurement.parameter.id) 

も同様に動作し、eを返します。 g。結果として1

+0

は、[この質問]に答えをい(https://stackoverflow.com/questions/31578559/django-foreignkey-limit-choices-to -a-different-foreignkey-id)は助けますか?それは可能ではないような自己参照のようです – ubadub

答えて

0

私はDjangoのORMではなく、データベースそのものが動作するため、これは可能ではないと思います。 measurementForeignKeyなので、2つのテーブルの関係です。しかし、テーブル間の関係はフィルタリングを処理しません。

したがって、これをモデルを更新するフォームのレベルで実装するか、モデルのsave関数をオーバーライドし、期待した期待値が満たされない場合はエラーをスローする必要があります。

0

非常に明確な答えは:あなたはそれを行うことはできません。 説明: モデルオブジェクト/保存を作成したときにmodel objectのみが作成され、その時点で指定されたインスタンスの有効な外部キーが渡されるため、モデル化する特定の選択肢に制限を与えることはできませんそれを視野から処理する必要があります。

したがって、viewのオプションの選択肢を処理している場合は、代わりにclean()メソッドをオーバーライドしてエラーを発生させることができます。あなたは以下のようにきれいな方法を使用することができ、モデル内の

def clean(self): 
    if self.measurement.parameter.id == 1: 
     # .. do whatever you want to write if this condition happens 
     pass 
    elif self.measurement.parameter.id in [1,2,3,4,55,6]: # or just pass set of ids, statically or with queryset 
     # .. code 
    else: 
     raise Exception("Unexpected selection of choice!!!") 
関連する問題