Как связать две таблицы, чтобы узнать, какое значение включено в поле ManyToMany в Django?

Надеюсь, что название не такое запутанное, как я думал. В настоящее время у меня есть таблица PaymentsData:

class PaymentsData(models.Model):
   match = models.CharField(max_length=30)
   amount = models.DecimalField(default = 0, max_digits = 5, decimal_places = 2)
   players = models.ManyToManyField(Profile, blank=True)
   playerspaid = models.ManyToManyField(Profile, related_name='paid', blank=True)
   datespent = models.DateField('Date Spent')

def __str__(self):
    return self.match

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

class PlayersPaymentDetails(models.Model):
    player = models.OneToOneField(Profile, on_delete=models.CASCADE)
    matches = models.ManyToManyField(PaymentsData, blank=True)
    amountdue = models.DecimalField(default = 0, max_digits=5, decimal_places = 2)

здесь в матчах, он должен показывать все матчи, которые игрок выбрал в поле игроков в PaymentsData, а amountdue должен показывать, сколько игрок должен всего.

Я попробовал настроить модель с помощью метода save(), однако когда players снимается выделение с PaymentsData, это не изменяет таблицу PlayersPaymentDetails

Надеюсь, кто-нибудь сможет помочь, спасибо. Дайте мне знать, если это не ясно.

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

player = Profile.objects.get(...) # get the player you want
matches = player.paymentsdata_set.all()

и amountdue:

from django.db.models import Sum

player = Profile.objects.get(...) # get the player you want
amountdue = player.paymentsdata_set.all().aggregate(amountdue=Sum('amountdue'))['amountdue']
Вернуться на верх