Django - Применение модели ко многим (1000's) объектам с внешним ключом в админке

У меня есть модель футбольного тренера и модель членского взноса, которая имеет внешний ключ к модели тренера.

В админке я хочу иметь возможность применять членство сразу к многим тренерам, а не только к одному. По сути, я представляю себе поле raw_id, которое можно выбирать.

У тренера есть поле баланс, и модель членства вычитает при сохранении некоторую сумму из этого поля тренера.

Возможно ли что-то подобное?

Вот мои модели:

class Trener(models.Model):
    class Meta:
        verbose_name = 'Trener'
        verbose_name_plural = 'Treneri'



    prezime = models.CharField(max_length=100) #new
    ime = models.CharField(max_length=100)

    balans = models.IntegerField() #new


    def __str__(self):
        return str(self.prezime)

и моя модель членства:

class Clanarina(models.Model):
    class Meta:
        verbose_name = 'Clanarina'
        verbose_name_plural = 'Clanarine'

    trener = models.ForeignKey(Trener, on_delete=models.CASCADE)
    datum_naplate = models.DateField()
    opis = models.CharField(max_length = 200, blank=True, null=True)
    iznos = models.IntegerField( verbose_name="iznos (uneti pozitivan broj)")

    # @property
    # def naplata(self):
    #     self.trener.balans -= self.iznos
    #     self.trener.save()
    #     return 

    def save(self, *args, **kwargs):
       self.trener.balans -= self.iznos
       self.trener.save()
       super(Clanarina, self).save(*args, **kwargs)

Заранее большое спасибо! Я новичок в django и не совсем уверен, правильно ли я создал свои модели!

Любая помощь или предложение будут высоко оценены!

Я пробовал с полями "многие ко многим" и со стилем inline, а также с полями raw_id, но не могу заставить его работать.

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

1- Вы можете использовать ManyToManyField для добавления тренеров к одному объекту членства.

2- Вы можете использовать действия django для достижения вашей цели.

в model.py:

class Membership(models.Model):
    class Meta:
        verbose_name = 'Membership'
        verbose_name_plural = 'Memberships'

    coaches = models.ManyToManyField(Coach)
    date_of_transaction = models.DateField()
    description = models.CharField(max_length = 200, blank=True, null=True)
    amount = models.IntegerField( verbose_name="amount (enter positiv integer)")

в файле admin.py:

@admin.register(models.Membership)
class MembershipAdmin(admin.ModelAdmin):
    actions = ['make_deduction']
    filter_horizontal = ('coaches', )
    
    @admin.action(description='Make payment deduction from the coaches of selected memberships')
    def make_deduction(self, request, queryset):
        for membership in queryset:
            for coach in membership.coaches.all():
                coach.balance -= membership.amount
                coach.save()

filter_horizontal позволяет фильтровать тренеров, выбирать несколько тренеров и добавлять их в членство.

Вы находитесь на странице просмотра списка участников:

  • Установите любой флажок слева от объектов членства
  • Выберите действие из выпадающего списка действий в верхней части страницы
  • Нажмите кнопку 'Go'

осуществляется вычитание.

Вернуться на верх