나는 비교적 장고를 처음 사용하기 때문에 가능한지 묻는다면 확실하지 않습니다.Django : CreateView 내부의 쿼리 및 계산
나는 사용자를 평가하고 리뷰를 작성하는 기능이있는 웹 사이트를 구축 중입니다. 나는 사용자를위한 모델 (평균 등급 필드가 있음)과 리뷰 모델 (author
, user_profile
, grade
및 review
)을 가지고 있습니다. 리뷰 작성에 CreateView
을 사용하고 있습니다.
나는 다음을 수행하려고 :
이 (
Reviews
모델에서) 그 사람의 모든 이전의 성적을 얻기 위해 쿼리를 만들려면.계산
저장 새 평균 등급 모델
저장 검토
UserProfile
에 (() 새 학년을 포함한 모든 이전의 성적을 합산 등급의 수에 의해 새로운 하나 모든 것을 나누기를 추가) 확인 현재 상세보기로리디렉션 사용자 모델
Reviews
에
Models.py
views.py
에서
class UserProfile(models.Model):
...
avg_grade = models.FloatField(blank=True, null=True)
...
class Reviews(models.Model):
user_profile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
grade = models.PositiveIntegerField()
review = models.CharField(max_length=256, null=True, blank=True)
author = models.CharField(max_length=256)
나는 새로운 평균 등급에 대한 계산을 할 경우 확실하지 해당 사용자의 등급의 쿼리를 만들기 위해 관리하지만, (이 안에 가능한 경우 클래스 기반-보기)
class CreateReview(LoginRequiredMixin, CreateView):
form_class = Forma_recenzije
success_url = reverse_lazy('detail')
template_name = 'accounts/recenzija.html'
def get_queryset(self):
u = UserProfile.objects.get(id=int(self.kwargs['pk']))
return Reviews.objects.filter(user_profile=u)
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.user_profile = UserProfile.objects.get(id=int(self.kwargs['pk']))
return super(CreateReview, self).form_valid(form)
urlpatterns : 당신이 super()
이라고 일단 당신이 반환하기 전에
[...
url(r'^dadilje/(?P<pk>[-\w]+)/$', views.DadiljaDetailView.as_view(), name="detail"),
url(r'^dadilje/(?P<pk>[-\w]+)/recenzija$', views. CreateReview.as_view(), name="recenzije")
...
]
UserProfile 모델을 저장하는 대신 annotate를 사용하여 제안하는 방법에 대해 투표했습니다. 계산 된 값을 저장하는 것은 조숙 한 최적화 일 수 있습니다. 사용자가 매우 많은 수의 리뷰 (DB 스펙에 따라 수십만 + 이상)를 갖지 않는 한, 주석이 충분히 잘 수행 될 것입니다. –
고마워, 그게 내가 찾고 있던거야. 내가 모델을주고 같은 이름을 보았 기 때문에 나는 그것을 작동시키는 데 몇 가지 문제점을 가지고 있었다. 주석 접근 방식을 알고 이전에 사용했지만 이제는 order_by() 메서드를 사용하여 해당 데이터를 정렬 할 수 있기를 원하며 더 이상 사용할 수 없게됩니다. –
주석이 달린 필드에서 주문할 수 있습니다. 예, 모델 및보기에 동일한 이름을 사용하지 마십시오. 단 하나의 모델명 (예 :'Review' 대신에'Review')을 사용하는 것이 좋습니다. (이 경우'Review'는 실제 모델 이름의 번역입니다.) – Alasdair