2013-10-30 5 views
0

사용자 정의 모델 필드 정의 내에서 장고 모델에 함수를 제공 할 수 있습니까?커스텀 Django 모델 필드를 모델링하는 기능을 기여합니까?

+0

당신이 성취하려는거야? 당신이하려는 것을 전적으로 따르지 않습니다. –

+0

나는 네가 할 수 있다고 생각하지 않는다. Django 필드는 db 컬럼을 Python 클래스/객체에 매핑합니다. 함수는 해당 클래스에서 정의해야합니다. –

답변

0

Django 모델 필드의 일부인 문서화되지 않은 contribute_to_class 함수를 사용하면 특성, 함수 및 필드 별 신호를 상위 모델에 추가 할 수 있습니다.

이의 예는 여기에서 볼 수 있습니다 :

https://github.com/mogga/django-positions/blob/master/positions/fields.py

(아래 조각)

def contribute_to_class(self, cls, name): 
    super(PositionField, self).contribute_to_class(cls, name) 
    for constraint in cls._meta.unique_together: 
     if self.name in constraint: 
      raise TypeError("%s can't be part of a unique constraint." % self.__class__.__name__) 
    self.auto_now_fields = [] 
    for field in cls._meta.fields: 
     if getattr(field, 'auto_now', False): 
      self.auto_now_fields.append(field) 
    setattr(cls, self.name, self) 

    def _position_move(instance, up): 
     collection = self.get_collection(instance) 
     cache_name = self.get_cache_name() 
     position = getattr(instance, cache_name)[0] 
     if up: 
      collection = collection.filter(**{'%s__gt' % self.name: position}) 
     else: 
      collection = collection.order_by('-%s' % self.name).filter(**{'%s__lt' % self.name: position}) 
     try: 
      replacement = collection[0] 
     except IndexError: 
      return 
     current, updated = getattr(instance, cache_name), getattr(replacement, cache_name) 
     setattr(instance, cache_name, updated) 
     setattr(replacement, cache_name, current) 
     instance.save() 
     replacement.save() 

    def position_down(self): 
     return _position_move(self, up=False) 

    def position_up(self): 
     return _position_move(self, up=True) 

    setattr(cls, 'position_down', position_down) 
    setattr(cls, 'position_up', position_up) 

    pre_delete.connect(self.prepare_delete, sender=cls) 
    post_delete.connect(self.update_on_delete, sender=cls) 
    post_save.connect(self.update_on_save, sender=cls) 
관련 문제