2015-01-20 3 views
-1

다음 필드가있는 장고 모델이 있습니다.Django 모델의 동적 필드

(사용자 세션의 실시간 정보에 의존하는 일부 계산을 기반으로) 이러한 모델에 동적으로 일부 특성을 추가하는 데 대한 장단점에 대해 조언 해 드리고 싶습니다.

저는 현재 구현에 만족하지만 장기적으로 그 의미에 대해 우려하고 있습니다. 나쁜 디자인 패턴으로 간주됩니까? 이 경우에는 더 깨끗하게 할 수있는 대안이 있습니까? 템플릿 태그에서 계산하는 것이 더 깔끔한가요?

어쩌면이 논리를 관리자에 넣을 수 있습니까? 프록시 모델? 나는 이것을 프로퍼티로 생각했지만, 계산은 요청 객체에 의존하기 때문에 어떻게 든 뷰에서 완료되어야한다.

고마워요.

class Printer(TimeStampedModel): 
    user = models.ForeignKey(
     User) 

    minimal_cost = models.IntegerField() 

    active = models.BooleanField(default=True) 



def some_view(request): 
     for printer in printer_list: 
      printer.distance = printer.distance_point(user_point) 
      printer.materials_costs = MaterialsCosts(printer, cart=cart) 
      printer.minimum_price = printer.materials_costs.minimum_printer_price() 
+0

에서

다음
class Printer(TimeStampedModel): user = models.ForeignKey( User) minimal_cost = models.IntegerField() active = models.BooleanField(default=True) @classmethod def set_my_attrs(cls): printer_list = cls.objects.all() #Im assuming that you need all the printers for your calculations for printer in printer_list: printer.distance = printer.distance_point(user_point) printer.materials_costs = MaterialsCosts(printer, cart=cart) printer.minimum_price = printer.materials_costs.minimum_printer_price() printer.save() # dont forget saving :) 

장고의 집계 또는 유사한 것을 사용? –

+0

이것들은 사소한 계산입니다. 예를 들어 Django는 거리 계산을 지원하지 않습니다 (GeoDjango 만 가능). 이 동적 필드가 잘못된 스타일이라는 것을 의미합니까? – cyberjoac

+1

기존 코드 (특히 오류없이 작동하는 코드) 최적화에 관한 질문은 codereview.stackexchange.com –

답변

1

계산 방법을 models.py로 옮길 수 있습니다.보기 내에서 직접 계산을 수행해서는 안됩니다. 데이터베이스 수준에서 그 계산을 수행에서 당신을 제한하는 어떤 당신의 views.py

def some_view(request): 

     Printer.set_my_attrs() 
+0

에 가장 적합합니다. 답변 해 주셔서 감사합니다. 내가하는 계산이 끈기있는 것은 아닙니다. 그들은 하나의 계산에 대해서만 유효합니다. DB에 저장할 필요가 없습니다. 여전히 모델에서 설정하는 것이 더 좋습니다. 이 경우 – cyberjoac

+0

@cyberjoac이 있으면 services.py와 같은 것을 만들고 거기에 계산을 옮겨야합니다. 나는 항상 요청과 응답을 처리하기 위해 3 개의 레이어, views.py를 가지고있다. services.py는 내 모델과 직접 관련이없는 복잡한 계산 및 기타 항목을 구현하고 마지막으로 내 models.py를 통해 거기에서 내 Model 인스턴스를 수정하는 모든 메서드를 배치합니다. – levi