代码之家  ›  专栏  ›  技术社区  ›  Kamil Septio Trojnar

一个模型中有2个用户

  •  0
  • Kamil Septio Trojnar  · 技术社区  · 7 年前

    Django新手。我正在尝试开发一个反馈模块,但是设计数据库结构会让我感到困惑,原因有很多:

    • 我需要在哪里存放 反馈得分 (正/中和/负反馈比率),应该放在自定义用户中,还是放在其他地方?

    • 如何为每个用户反馈每次计算的_分数?

    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']
    

    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'),
    
    ]
    

    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 回复  |  直到 7 年前
        1
  •  0
  •   assenuma    7 年前

    反馈得分应该是反馈模型中的类方法,而不是字段。通常,您不希望数据库中的字段可以直接从其他字段派生。例如:

    class Person(models.Model):
        name = models.CharField()
        birthdate = models.DateField()
        zodiac_sign = models.CharField()
    

    如果我有出生日期,我可以很容易地得到十二生肖。所以,十二生肖符号应该是一种方法。你的案子也一样。只需创建一个方法来返回反馈的摘要信息。

        2
  •  0
  •   ruddra    7 年前

    我认为你们目前的模型设计符合要求。只要修好 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 . 你现在的工具也反映了这一点。

    如何为每个用户反馈每次计算的_分数?

    user = User.objects.get(id=1)  # or user = request.user
    latest_feedback = user.feedback_left_by.last()