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'
осуществляется вычитание.