Django ошибка: save () получил неожиданный аргумент ключевого слова 'toppings' - PullRequest
0 голосов
/ 29 января 2020

В интерфейсе администратора, после заполнения полей и нажатия кнопки «Сохранить», я получаю эту ошибку Может кто-нибудь сказать мне, в чем проблема? Из того, что я прочитал, эта проблема часто возникает из-за того, что эта строка кода не ставится super(Pizza, self).save(*args, **kwargs), но я все еще получаю эту ошибку и не могу понять, почему

К вашему сведению: я хочу, чтобы каждая пицца имела Топпинг сыра по умолчанию, и это для всей пиццы, и он не может быть в состоянии удалить его

class Topping(models.Model):                                                                                         
    name = models.CharField(max_length=64)                                                                           

    def __str__(self):                                                                                               
        return(f"{self.name}")                                                                                       


class Pizza(models.Model):                                                                                           
    PIZZA_SIZES = (                                                                                                  
        ('S', 'Small'),                                                                                              
        ('L', 'Large'),                                                                                              
    )                                                                                                                

    pizza_type = models.CharField(max_length=64)                                                                     
    pizza_size = models.CharField(max_length=1, choices=PIZZA_SIZES)                                                 
    qty_toppings = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(3)], default=0)           
    toppings = models.ManyToManyField(Topping)                                                                       
    price = models.IntegerField(help_text="Price in $")                                                              


    def __str__(self):                                                                                               
        return f"Size: {self.get_pizza_size_display()}, Type: {self.pizza_type}, Number of Toppings: {self.qty_toppi\
ngs},  Price: {self.price}, Toppings: {self.toppings.in_bulk()}"                                                     

    def save(self, *args, **kwargs):                                                                                 
        # if 'toppings' not in kwargs:                                                                               
        # kwargs.setdefault('force_insert', True)                                                                    
        # kwargs.setdefault('force_update', True)                                                                    
        kwargs.setdefault('toppings', Topping.objects.get(name='Cheese'))                                            
        super(Pizza, self).save(*args, **kwargs) 

1 Ответ

1 голос
/ 29 января 2020

Вы не можете добавить связанные через M2M объекты в запись до ее сохранения. Прочитайте это сделать c о M2M.

Вы можете сделать, как предлагается в комментариях:

def save(self, *args, **kwargs):                                                                                                                                                                                          
    super(Pizza, self).save(*args, **kwargs)
    self.toppings.add(Topping.objects.get(name='Cheese'))

Или вы можете установить post_save signal :

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Pizza)
def update_stock(sender, instance, **kwargs):
    instance.toppings.add(Topping.objects.get(name='Cheese'))
...