Django的新手。我正在尝试开发一个反馈模块,但是由于各种原因,设计数据库结构使我感到困惑:
我需要在哪里存储 feedback_score (正/中性/负反馈比),应将其放置在自定义用户中还是其他位置?
我应该如何获得反馈凭据的接收者,是否应通过URL传递,如何在基于类的视图中将接收者链接到FeedbackModel?
如何为每个用户每次计算feedback_score?
models.py
User = get_user_model()
# Create your models here.
class FeedbackModel(models.Model):
id = models.AutoField(primary_key=False, db_column='id')
sender = models.ForeignKey(
User,
on_delete=models.CASCADE,
primary_key=False, related_name='feedback_left_by')
# recipient = models.ForeignKey(
# User,
# on_delete=models.CASCADE,
# primary_key=True)
FEEDBACK_OPTION = (
(-1, 'Negative'),
(0, 'Neutral'),
(+1, 'Good'),
)
feedback = models.IntegerField(choices=FEEDBACK_OPTION)
opinion = models.CharField(max_length=255)
class Meta:
ordering = ['left_by', '-id']
urls.py
from django.urls import path
from . import views
app_name = 'feedback'
urlpatterns = [
path('leave_feedback/<str:left_to>/',
views.leave_feedback.as_view(), name='leavefeedback'),
]
views.py
from django.shortcuts import render, reverse
from django.views.generic import TemplateView, CreateView
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from .models import FeedbackModel
decorators = [login_required]
@method_decorator(decorators, name='dispatch')
class leave_feedback(CreateView):
model = FeedbackModel
fields = ['feedback', 'opinion']
success_url = '/'
#template_name = "feedback/leave_feedback.html"
def form_valid(self, form):
form.instance.sender = self.request.user
# ?
return super().form_valid(form)
自定义用户
class User(AbstractUser):
(...)
@property
def feedback_score(self)
return ???
答案 0 :(得分:0)
我需要在哪里存储feedback_score(正/中性/负反馈比率),应将其放在自定义用户中还是其他地方?
我认为您当前的模型设计可以满足要求。只需修复 class Meta 中的ordering
。
顺便说一句,如果您只希望用户获得一个反馈,请考虑使用OneToOneField。如果您希望获得反馈的比例,只需执行以下操作:
feedbacks = Feeback.objects.all()
positive_feedbacks = feedbacks.filter(feedback=1).count() # returns count of the feedback
negative_feedbacks = feedbacks.filter(feedback=-1).count() # returns count of the feedback
neutral_feedbacks = feedbacks.filter(feedback=0).count() # returns count of the feedback
print("Ratio Positive:Negative:Neutral = {}:{}:{}".format(positive_feedbacks/negative_feedbacks, 1, neutral_feedbacks/negative_feedbacks)
我应该如何获取反馈凭据的接收者,是否应该通过URL传递,如何在基于类的视图中将接收者链接到FeedbackModel?
您需要使用户登录到系统。例如,您可以关注this tutorial,但那里还有其他很好的例子。登录系统后,可以通过request.user
来访问该用户。您当前的工具也可以反映这一点。
如何为每个用户每次计算feedback_score?
您可以通过以下方式获取最新反馈:
user = User.objects.get(id=1) # or user = request.user
latest_feedback = user.feedback_left_by.last()
答案 1 :(得分:0)
feedback_score应该是FeedbackModel中的类方法,而不是字段。通常,您不希望数据库中的字段可以直接从其他字段派生。例如:
class Person(models.Model):
name = models.CharField()
birthdate = models.DateField()
zodiac_sign = models.CharField()
如果我有生日,我可以很容易地得到十二生肖。因此,zodiac_sign应该是一种方法。同样适用于您的情况。只需创建一个在反馈中返回摘要信息的方法即可。