Django (2.0.6): обновление связанных объектов m2m в сигналах

weijie lin спросил: 10 мая 2018 в 04:45 в: python

Я как бы пытался получить обновленный список связанных объектов из поля m2m

Например. У меня есть следующие модели.

class Product(models.Model):
    title = models.CharField(max_length=120)
    slug = models.SlugField(blank=True, unique=True)
    description = models.TextField(default='N/A')
    price = models.DecimalField(decimal_places=2, max_digits=20, default=10.00)
    image = models.ImageField(upload_to=upload_image_path, null=True, blank=True)
    featured = models.BooleanField(default=False)
    active = models.BooleanField(default=True)
    category = models.CharField(blank=True, max_length=20, choices=CATEGORIES)
    size = models.CharField(max_length=100, choices=AVAILABLE_SIZE, blank=True)
    choice = models.CharField(max_length=100, choices=AVAILABLE_CHOICE, blank=True)    objects = ProductManager()    def get_absolute_url(self):
        return "/products/{slug}/".format(slug=self.slug)    def __str__(self):
        return self.titleclass Cart(models.Model):
    user = models.ForeignKey(User, null=True, blank=True, on_delete=True)
    products = models.ManyToManyField(Product, blank=True)
    total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    subtotal = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    timestamp = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)    objects = CartManager()    def __str__(self):
        return str(self.id)

Теперь я обновляю свое поле «products» с помощью django admin, просто удаляя и добавляя элементы.

Поэтому я ожидаю, что сигнал ниже , напечатает обновленный продукт (который я только что добавил / удалил). Тем не менее, я все еще получаю все продукты (все продукты из модели продукта).

def m2m_changed_cart_receiver(sender, instance, action, *args, **kwargs):
    if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
        print(action)
        products = instance.products.all()
        print(products)
        total = 0
        for x in products:
            total += x.price
        if instance.subtotal != total:
            instance.subtotal = total
            instance.save()m2m_changed.connect(m2m_changed_cart_receiver, sender=Cart.products.through)

Я новичок в django, каждый может пролить некоторый свет, будет очень полезно.

1 ответ

Jibin Mathews ответил: 10 мая 2018 в 03:58

Вам нужно использовать pk_set

try:

pk_set = kwargs.pop('pk_set', None)

Для действий pre_add, post_add, pre_remove и post_remove это набор значений первичного ключа которые были добавлены или удалены из отношения.

Для действий pre_clear и post_clear это None.

docs

Дополнительное видео по вопросу: Django (2.0.6): обновление связанных объектов m2m в сигналах

066 M2M Changed Signal to Calculate Cart Total in django | django ecommerce | django

Photosensor to Django

The Best Django Tutorial Building Our Database Using Many To Many Fields