Как я могу установить связь между двумя полями с различными классами Django? - PullRequest
1 голос
/ 23 апреля 2019

у меня есть две модели класса "клуб" и класс "матч", и у меня есть внешний ключ к клубу но я не могу увеличить поле "выиграл" (или ничья или проиграл) в классе "Club" на "score_local" и "score_visitor" в классе "Match" .. как я могу это сделать

class Club(models.Model):
    league_names = models.ForeignKey(League, on_delete= models.CASCADE, related_name='club')
    name = models.CharField(max_length=100)
    logo = models.ImageField(upload_to='media/core', max_length=255, null=True, blank=True)
    year_of_establishment = models.IntegerField(default=1900)
    won = models.IntegerField(default=0)
    draw = models.IntegerField(default=0)
    lost = models.IntegerField(default=0)

    def CalcPoints(self):
         return self.won*3 + self.draw            

    total_points = property(CalcPoints)

class Match(models.Model):
    play_date = models.DateTimeField('play date')
    occasion = models.ForeignKey(League, on_delete=models.CASCADE, related_name='match')
    club_visitor = models.ForeignKey(Club, on_delete=models.CASCADE, related_name='match_club_visitor')
    club_local = models.ForeignKey(Club, on_delete=models.CASCADE, related_name='match_club_local')
    score_visitor = models.IntegerField()
    score_local = models.IntegerField()

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Вы не можете установить связь между полями даже в одной модели, но вы можете переопределить метод save в Match, вы можете реализовать обработчик signal , который будет вызываться после каждого match спасись.

@receiver(post_save, sender=Match)
def update_club_score(sender, instance, **kwargs):
    # Local won.
    if instance.score_local > instance.score_visitor:
        instance.club_local.won += 1
        instance.club_local.save()
        instance.club_visitor.lost += 1
        instance.club_visitor.save()
    # Local lost.
    if instance.score_local < instance.score_visitor:
        instance.club_visitor.won += 1
        instance.club_visitor.save()
        instance.club_local.lost += 1
        instance.club_local.save()
    # Draw
    if instance.score_local == instance.score_visitor:
        instance.club_local.draw += 1
        instance.club_local.save()
        instance.club_visitor.draw += 1
        instance.club_visitor.save()
0 голосов
/ 23 апреля 2019

Вам нужно будет обновить поля ваших моделей как-то.

Я бы предложил что-то вроде:

Сначала напишите функцию, которая возвращает вам трефы из базы данных:

def get_clubs(local_club_id, visitor_club_id):
    local_club = Club.objects.filter(pk=self.local_club_id)[0]
    visitor_club = Club.objects.filter(pk=self.visitor_club_id)[0]
    return local_club, visitor_club

И тогда вы можете соответствующим образом обновить выигрыши и проигрыши (в вашем views.py):

def update_scores(request):
    match = request.match
    club_local, club_visitor = get_clubs(match.club_local.pk, match.club_visitor.pk)
    if match.score_local > match.score_visitor:
        # home team won
        club_local.update(won=match.club_local.won + 1)
        club_visitor.update(lost=match.club_visitor.lost + 1)
    elif match.score_visitor > match.score_local:
        # away team won
        club_visitor.update(won=match.club_visitor.won + 1)
        club_local.update(lost=match.club_local.lost + 1)
    else:
        # it's a draw
        club_local.update(draw=match.club_local.draw + 1)
        club_visitor.update(draw=match.club_visitor.draw + 1)

После этого ваша функция свойства должна работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...