Как переопределить, сколько много ко многим экономит на «сквозном» поле в Django? - PullRequest
0 голосов
/ 10 июня 2019

Сводка

Я хочу автоматически увеличить поле order на Item, определенное полями m2m в пределах Set (плохое имя, которое я знаю), поэтому я могу легкоизменить их порядок.Поле «многие ко многим» определяется моделью through, называемой SetMeta, которая содержит только item, set и новое поле order.Я пробовал ездить save(), но это никогда не называется.Как программно установить order на значение, отличное от значения по умолчанию, каждый раз, когда item добавляется к set?

Сведения

Каждый раз, когда новыйitem добавлено к set, я хочу установить order на len(set.items.all()).Для этого я переопределил save () в SetMeta, но он никогда не вызывается.Что мне нужно переопределить, чтобы убедиться, что это работает так, как я хотел?

models.py

class Item(models.Model, AdminVideoMixin):
    title = models.TextField(max_length=5000)
    ....

class Set(Item):
    items = models.ManyToManyField(Item, related_name='in_sets', through='SetMeta', max_length=5000,)

    def get_absolute_url(self):
        return reverse('curate:set_detail',kwargs={'slug':self.slug})

    def get_queryset(self):
        return self.items.all().order_by('-itemOrder__order')

    def __str__(self):
        return self.title

    def auto_increment_order(self):
        print('IS THIS WORKING') <----never prints.
        length_of_set = len(self.set.items.all())
        return length_of_set

class SetMeta(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='itemOrder', max_length=5000)
    set = models.ForeignKey(Set, on_delete=models.CASCADE, related_name='SetOrder', max_length=5000)
    order = models.IntegerField(default=0, null=True,)

    def up(self):
        self.order += 1
        self.save()
        print(self.order)

    def down(self):
        self.order -= 1
        self.save()
        print(self.order)

    def save(self, *args, **kwargs):
        if self.order == 0:
            self.order = auto_increment_order(self)
        super(SetMeta, self).save(*args, **kwargs)
        print(f"{self.item.title} order is {self.order}") < ---- this never fires.

1 Ответ

0 голосов
/ 10 июня 2019

Он будет запущен, если вы создадите объект, подобный этому:

print(set.items.all().count())  # 

item = Item.objects.first()
set = Set.objects.first()
icount = set.items.count() + 1
SetMeta.objects.create(item=item, set=set, order=icount)

print(set.items.all().count())

Пожалуйста, проверьте documentation для более подробной информации.

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