gpt4 book ai didi

python - Django:帮助覆盖模型的 save() 方法,以根据对象创建函数自动填充 CharField

转载 作者:行者123 更新时间:2023-12-01 00:14:05 25 4
gpt4 key购买 nike

我有一个模型(膳食),其中包含多个多对多字段(蛋白质、碳水化合物和脂肪),我最近在其中添加了一个“名称”CharField。我想允许用户输入餐食的名称,但如果他们不输入名称,我希望根据模型中的函数定义自动填充该名称,该函数定义只是将其中的食物名称连接起来一弦。我试图遵循这个 guide

现在,如果膳食已经存在,那么我所拥有的实际上就可以正常工作。但是,如果它不存在,则每个项目的 food_name 似乎尚未保存,因为它们是空的。我将 super(Meal,self).save() 语句放在 if not self.name: 语句之前,希望这会将对象保存到数据库中,这样然后可以检索 food_names,但它不起作用,而是当我保存时,名称被保存为“(0)”。我正在寻找通过 __str__ 函数填充的名称,例如“Pork Tenderloin, Spinach (steamed/boiled), Potato (Red,medium) (3)”。

此外,如果我不在 if 语句之前调用 super(Meal,self).save(),我实际上会收到“超出最大递归深度”错误。

谁能告诉我是否有一种方法可以根据我所描述的对象创建的函数定义自动填充此名称字段?

我是 Django 新手,并且对 Python 的经验有限,因此非常感谢您提供的任何帮助。

这是我的模型:

class Meal(models.Model):
class Meta:
verbose_name_plural = 'Meal Plan Meals'

name = models.CharField(max_length=255,blank=True,null=True)
proteins = models.ManyToManyField(to="Food", limit_choices_to={'food_type': 'P'},blank=True,related_name='food_proteins')
carbohydrates = models.ManyToManyField(to="Food", limit_choices_to={'food_type': 'C'}, blank=True, related_name='food_carbohydrates')
fats = models.ManyToManyField(to="Food", limit_choices_to={'food_type': 'F'}, blank=True, related_name='food_fats')

def all_foods(self):
return list(self.proteins.all())+list(self.carbohydrates.all())+list(self.fats.all())

def __str__(self):
return ', '.join(map(lambda x: x.food_name, self.all_foods()))+f' ({len(self.all_foods())})'

def save(self):
super(Meal,self).save()
if not self.name:
self.name = self.__str__()
self.save()

编辑:

我尝试这样做的主要原因是因为我需要能够对我的 Meal 模型中的 __str__ 方法返回的字符串进行排序,但在堆栈溢出 here 上发布另一个问题之后我发现我相信这是不可能的。看来你只能对模型中的字段进行排序,所以我选择添加一个名称字段(我还决定允许用户根据需要为膳食命名,而不是让它自动填充) 。目前,当有很多餐食时,不可能找到任何一餐,因为订购是基于PK的,这在项目名称方面显得完全随机,并且使其几乎无法使用。这是一张图片供引用:

meal list

目前,我仅通过 django admin ui 创建膳食对象。这是 admin.py 中我的 MealAdmin 的代码:

class MealAdmin(admin.ModelAdmin):
model = Meal
save_as = True
#search bar - search by food name
search_fields = ['name','proteins__food_name','carbohydrates__food_name','fats__food_name',]
fieldsets = (
(None, {
'fields': ('name', 'proteins', 'carbohydrates', 'fats',),
'description': "Note: If you do not choose a name for your meal the meal will be named according to all of the foods it contains. Ex: 'Chicken Breast,Rice (white) (cooked),Avocado'"
}),
)

还有一张图片供引用:

enter image description here

因此,如果有人知道如何使保存函数根据我的 __str__ 函数或任何其他解决方法在创建时自动填充名称字段,我们将不胜感激!

最佳答案

如果您希望在通过admin界面创建新实例时发生某些事情,则方法与仅覆盖模型save方法不同:您必须覆盖admin 声明中的 save_model 方法。

您可以尝试如下所示:

# admin.py
class MealAdmin(admin.ModelAdmin):

def save_model(self, request, obj, form, change):
obj.save()
form.save_m2m()
# your custom stuff goes here
if not obj.name:
obj.name = obj.__str__()
obj.save()

关于python - Django:帮助覆盖模型的 save() 方法,以根据对象创建函数自动填充 CharField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com