В Django Сохранить новую запись в одной таблице и обновить существующую запись в другой после нажатия кнопки пользователем - PullRequest
0 голосов
/ 29 марта 2020

Цель: создать страницу, где пользователь может выбрать одну из двух «идей», нажав соответствующую кнопку. Я регистрирую каждый выбор в отдельной модели. Затем модель рассчитывает новый «балл». Затем я обновляю таблицу «идей» новым счетом.

Текущее состояние: я, вероятно, не подхожу к нему самым логичным способом (все еще начинающий), но у меня большая часть работы работает, пока я не попытаюсь вычислите балл в модели, а затем сохраните в таблице идей.

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

Модели

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status=1)

class ideas(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100)
    description = models.TextField()
    author = models.EmailField()
    elo_score = models.SmallIntegerField(default=1500)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    release = models.CharField(max_length=10, blank=True)
    s_in_review = 0
    s_open = 1
    s_rejected = 2
    s_completed = 3
    s_choices = (
        (s_in_review, _('In Review')),
        (s_open, _('Open')),
        (s_rejected, _('Rejected')),
        (s_completed, _('Completed')),
    )
    status = models.PositiveSmallIntegerField(
        choices=s_choices,
        default=s_in_review,
    )
    objects = models.Manager()
    published = PublishedManager()

    class Meta:
        verbose_name_plural = "ideas"

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(ideas, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('backlog:idea-detail', args=[self.slug])


class pairwise_results(models.Model):
    win_idea = models.ForeignKey(ideas, on_delete=models.CASCADE, related_name='win_idea_name')
    lose_idea = models.ForeignKey(ideas, on_delete=models.CASCADE, related_name='lose_idea_name')
    datetime = models.DateTimeField(auto_now_add=True)
    win_elo = models.SmallIntegerField(default=1500)
    lose_elo = models.SmallIntegerField(default=1500)
    new_win_elo = models.SmallIntegerField(default=1500)
    new_lose_elo = models.SmallIntegerField(default=1500)
    def win_elo_transformed(self):
        return 10**(self.win_elo/400) #hard-coded variable
    def lose_elo_transformed(self):
        return 10**(self.lose_elo/400) #hard-coded variable
    def win_expected(self):
        return self.win_elo_transformed()/(self.win_elo_transformed()+self.lose_elo_transformed())
    def lose_expected(self):
        return self.lose_elo_transformed()/(self.win_elo_transformed()+self.lose_elo_transformed())
    def win_elo_new(self):
        return self.win_elo+25*(1-self.win_expected())
    def lose_elo_new(self):
        return self.lose_elo+25*(0-self.win_expected())

    def __str__(self):
        return self.datetime.strftime("%m/%d/%Y, %H:%M:%S")

    def save(self, *args, **kwargs):
        self.new_win_elo = self.win_elo_new()
        self.new_lose_elo = self.lose_elo_new()
        super(pairwise_results, self).save(*args, **kwargs)

Представления - я не уверен, стоит ли объединять их и обрабатывать с помощью get / опубликовать или разбить их еще больше

def idea_pairwise(request):
    last=ideas.published.count()-1
    index1 = random.randint(0,last)
    index2 = random.randint(0, last-1)
    if index2==index1: index2=last
    idea1 = ideas.published.all()[index1]
    idea2 = ideas.published.all()[index2]
    context = {'idea1': idea1, 'idea2': idea2}
    return render(request, 'backlog/ideas_pairwise.html', context)

def choose_pairwise(request, win_id, lose_id):
    w_idea = get_object_or_404(ideas, id=win_id)
    l_idea = get_object_or_404(ideas, id=lose_id)
    new_choice = pairwise_results(win_idea=w_idea, lose_idea=l_idea, win_elo=w_idea.elo_score, lose_elo=l_idea.elo_score)
    new_choice.save()
    #new_record = new_choice.save(commit=False)
    w_idea.elo_score = new_choice.win_elo_new()
    l_idea.elo_score = new_choice.lose_elo_new()
    return redirect('backlog:idea_pairwise')

HTML:

<div class="row m-4">
    <div class="card-deck container-fluid">
        <div class="card">
            <div class="card-body">
                <h5 class="card-title">{{ idea1.title }}</h5>
                <p class="card-text">{{ idea1.description }}</p>
            </div>
            <div class="card-footer text-center">
                <!-- <a href="#" class="btn btn-primary">Choose Idea 1</a> -->
                <form action="{% url 'backlog:choose_pairwise' idea1.id idea2.id %}" method="post">{% csrf_token %}<input class="btn btn-primary" type="submit" name="chosen_idea" value="Choose Idea 1" /></form>
            </div>
        </div>
        <div class="card">
            <div class="card-body">
                <h5 class="card-title">{{ idea2.title }}</h5>
                <p class="card-text">{{ idea2.description }}</p>
            </div>
            <div class="card-footer text-center">
                <!-- <a href="#" class="btn btn-primary">Choose Idea 2</a> -->
                <form action="{% url 'backlog:choose_pairwise' idea2.id idea1.id %}" method="post">{% csrf_token %}<input class="btn btn-primary" type="submit" name="chosen_idea" value="Choose Idea 2" /></form>
            </div>
        </div>
    </div>
</div>

URLs

path('ideas/rank/pairwise/', idea_pairwise, name='idea_pairwise'),
path('ideas/rank/pairwise/choose/<int:win_id>/<int:lose_id>/', choose_pairwise, name='choose_pairwise'),
...