【问题标题】:Django error: save() got an unexpected keyword argument 'toppings'Django 错误:save() 得到了一个意外的关键字参数“toppings”
【发布时间】:2020-05-14 17:28:14
【问题描述】:

在管理 UI 上,填写字段并按下“保存”按钮后,我收到此错误 谁能告诉我是什么问题?根据我的阅读,这个问题通常是由于没有输入这行代码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) 

【问题讨论】:

  • 你可以这样做self.toppings.add(Topping.objects.get(name='Cheese'))。参考this

标签: django django-models save m2m


【解决方案1】:

在保存之前,您不能通过 M2M 对象添加相关的记录。阅读 this doc 了解 M2M。

您可以按照 cmets 提供的方式进行操作:

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

或者你可以设置post_save信号:

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'))

【讨论】:

  • 非常感谢,这可以在python manage.py shell 下工作,管理员的 UI 怎么样?我假设我必须覆盖 admin's models save method?
  • 你宁愿找save_related管理模式方法。
最近更新 更多