一个模型2个用户

时间:2018-11-17 15:54:00

标签: django django-models django-views

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 ???

2 个答案:

答案 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应该是一种方法。同样适用于您的情况。只需创建一个在反馈中返回摘要信息的方法即可。