Как я могу обновить поля другой модели при сохранении другой формы - PullRequest
0 голосов
/ 05 октября 2019

Привет, у меня есть 2 модели Game и Match

models.py

class Game(models.Model):
    title = models.CharField(max_length=255)
    team1score = models.IntegerField(null=True, blank=True,default=0)
    ...
    team2score = models.IntegerField(null=True, blank=True,default=0)
    ...



class Match(models.Model):
    title = models.CharField(max_length=255)
    game=models.ForeignKey(Game,on_delete=models.CASCADE)
    team1score = models.IntegerField(null=True, blank=True,default=0)
    ...
    team2score = models.IntegerField(null=True, blank=True,default=0)
    ...

forms.py

class MatchForm(forms.ModelForm):
    team1score = forms.IntegerField(widget=forms.TextInput,required=False)
    team2score = forms.IntegerField(widget=forms.TextInput,required=False)


    class Meta:
        model=Match
        fields=['team1score',
                'team2score',
                ...
                ]

Я создаюсопоставьте объект с кодом ниже.

views.py

def creatematch(request,...):
     form = MatchForm(request.POST or None)

        if form.is_valid():
            match = form.save(commit=False)
            ...

            match.save()
            ...

Теперь у меня вопрос, как я могу обновить game.team1score и game.team2score при создании match объектов

1 Ответ

0 голосов
/ 05 октября 2019

Используйте ForeignKey отношение вашей Match модели, чтобы получить нужный экземпляр Game:

def creatematch(request,...):
     form = MatchForm(request.POST or None)

        if form.is_valid():
            match = form.save(commit=False)[0]
            game = match.game 
            game.team1score += match.team1score
            game.team2score += match.team2score
            game.save()
            match.save()

Но это неоптимальное решение, потому что вы на самом деле запускаете SELECT * FROM GAME, дождитесь результата, затем выполните все вычисления перед отправкой второго запроса в вашу базу данных.

Вместо этого вам следует использовать F(), который выполняет этот расчет в вашей базе данных:

from django.db.models import F

def creatematch(request,...):
     form = MatchForm(request.POST or None)

        if form.is_valid():
            match = form.save(commit=False)[0]
            game = match.game 
            game.team1score = F('team1score') + match.team1score
            game.team2score = F('team2score') + match.team2score

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