2017-01-28 6 views
1

私はdjango開発の初心者です。私はdjangoが提供するデフォルトモデルフィールドを常に知っていましたが、本を読んでいるうちに、そして、Djangoがカスタムモデルのフィールドを持っていることを知って来た、誰かが私に下のコードが何かを知らせることができます。 お返事ありがとうございます。djangoでカスタムモデルフィールドを作成する方法とその仕組み

Models.py

class Module(models.Model): 
    course = models.ForeignKey(Course, related_name='modules') 
    title = models.CharField(max_length=200) 
    description = models.TextField(blank=True) 
    order = OrderField(blank=True, for_fields=['course']) 

fields.py

class OrderField(models.PositiveIntegerField): 
    def __init__(self, for_fields=None, *args, **kwargs): 
     self.for_fields = for_fields 
     super(OrderField, self).__init__(*args, **kwargs) 

    def pre_save(self, model_instance, add): 
     if getattr(model_instance, self.attname) is None: 
      # no current value 
      try: 
       qs = self.model.objects.all() 
       if self.for_fields: 
        query = {field: getattr(model_instance, field) for field in self.for_fields} 

        qs = qs.filter(**query) 
       last_item = qs.latest(self.attname) 
       value = last_item.order + 1 

      except ObjectDoesNotExist: 
       value = 0 
      setattr(model_instance, self.attname, value) 
      return value 

     else: 
      return super(OrderField,self).pre_save(model_instance, add) 
+0

あなたはそれを自分で実行しようとしましたか? –

答えて

1

このフィールドはfor_fieldsパラメータで指定したフィールドの値が同じ他のエンティティを追跡します。このフィールドを持つモデルの新しいインスタンスを保存すると、for_fields定義されたフィールドの同じ値を持つデータベース内の他のエンティティが検索され、これらのプラスの量が注文フィールドに格納されます。

あなたのユーザに表示したいエンティティのテーブルでは、orderの値に応じて、作成/更新の順番で、これらのフィールドで同じ値を持つエンティティをソートすることができます。

のは、あなたが今、あなたはこれらのコースのいずれかを参照する新しいモジュールを作成し、IDS

[1, 2, 3]

を使用して、データベース内のすでに3つのコースを持っていると仮定しましょう。

あなたの4つの新しいモジュールは、現在の順序フィールドに次の値を持っているでしょう
Module(course_id=1, title='First').save() # No 1 
Module(course_id=2, title='Second').save() # No 2 
Module(course_id=1, title='Third').save() # No 3 
Module(course_id=1, title='Fourth').save() # No 4 

ない1:0(もちろん1を持つ他のモジュール)

ありません2:0(なし、他のモジュール)コース2と

なし3:1(コース1つの他のモジュール)

なし4:2(二つの他のモジュールが既に1を参照コースを持っている)

これで、同じコースのエンティティを注文フィールドの値で並べ替えることができました。

関連する問題