2 пользователя в одной модели - PullRequest
0 голосов
/ 17 ноября 2018

Новый для Джанго.Я пытаюсь разработать модуль Feedback, но проектирование структуры базы данных приводит меня в замешательство по разным причинам:

  • Где мне нужно хранить 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 голосов
/ 17 ноября 2018

feedback_score должен быть методом класса в FeedbackModel, а не полем.Как правило, вам не нужны поля в вашей базе данных, которые могут быть напрямую получены из других полей.Например:

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

Если у меня есть дата рождения, я могу легко получить знак зодиака.Итак, zodiac_sign должен быть методом.То же самое относится и к вашему делу.Просто создайте метод, который возвращает сводную информацию по обратной связи.

0 голосов
/ 17 ноября 2018

Где мне нужно хранить feedback_score (положительный / нейтральный / отрицательный коэффициент обратной связи), должен ли он быть помещен в пользовательский пользователь или где-то еще?

Я думаю, что у вас есть текущая модель, которая соответствует требованиям. Просто исправьте ordering в классе Meta . Кстати, если вы хотите, чтобы у пользователя была только одна обратная связь, рассмотрите возможность использования 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 в представлениях на основе классов?

Вам необходимо выполнить вход пользователя в систему. Например, вы можете следовать этому руководству , но есть и другие хорошие примеры. После входа в систему пользователь становится доступным через request.user. И ваше текущее орудие также отражает это.

Как рассчитать feedback_score каждый раз для каждого пользователя?

Вы можете получить последнюю обратную связь по:

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