如何在 Django 中 add/transfer 从一个模型到另一个模型的值列表?
How to add/transfer the values list from one model to another in django?
让我向您展示我已经成功完成的事情以及我现在正在努力实现的目标。
我有 2 个模型。两者都有相同的 3 个字段。姓名、月份、编号。两个型号分别是Main和BMO。
我根据名称和月份筛选第一个模型,并获得数字列的值列表。代码看起来像这样-
result= Main.objects.filter(name="John", month='apr').values_list('number', flat=True)
然后我用 for 循环和条件在 django 模板上显示它。代码看起来像这样 -
<p>result:
<span>
{% for i in result %}
{{i}}{% if not forloop.last %}+{% endif %}
{% endfor %}
</span>
</p>
result = 2+4+12+7+18
最后一行向您展示了它在模板上的实际外观。你可以看到我在值之间用 + 号显示它。
我想达到的目标:
我想获得相同的值列表,但我不想在模板上显示它,而是想将它插入到另一个模型的字段中。需要明确的是,我希望将所有带有加号的值(它在我的模板上的显示方式)插入到第二个模型 BMO 的单个字段中。如果我有 10 个值,它们都应该用加号连接并添加到一个字段中,而不是分散到一列的 10 行中。
这是我尝试过的:
我根据名称和月份筛选了第二个模型 BMO,并尝试使用 .update() 方法更新数字。我在第一行代码正下方的 views.py 中添加了以下代码行。我根本没有使用模板。
result= Main.objects.filter(name="John", month='apr').values_list('number', flat=True)
Bmo.objects.filter(name="test", month='apr).update(number = result)
它没有更改或添加任何内容。所以我尝试了一行带有 for 循环的新代码,就像这样 -
result= Main.objects.filter(name="John", month='apr').values_list('number', flat=True)
for i in result:
Bmo.objects.filter(name__icontains = 'test').update(number = i)
这也没有改变任何事情。只有 1 行名称为 'test',所以我没有使用月份过滤器。并不完全相信 for 循环,但我之前已经成功更新了名称与此确切代码匹配的类别,所以我认为这可能有效。不同之处在于类别是单个字符串,如 category='personal' 而不是本例中的变量或多个变量。
我认为我非常接近实现我想要的,只需一行或两行代码。如果有更简单的方法来做我想做的事情,我会洗耳恭听。感谢您的任何意见。
更新:
在得到 Ahtisham 的答复后,我更新了代码。但不幸的是,它并没有改变任何东西。我正在同一模型中尝试。什么都没坏。控制台中没有错误。我 运行 代码没有任何反应。下面是 views.py 的主要部分:
def index(request):
form = BmoForm()
if request.method == 'POST':
form = BmoForm(request.POST)
if form.is_valid():
form.save()
R = Bmo.objects.all()
var="apr"
result = Bmo.objects.filter(name="Transfer", month=var).values_list('number', flat=True)
number = str()
count = len(products1)
new = 12+3
for index, r in enumerate(products1):
number +=str(r) + '+' if count != index+1 else str(r)
Bmo.objects.filter(name = "test", month = "apr").update(number = number)
变量“new”仅用于测试。当我硬编码要更新的变量时,它起作用了。但它不会用变量“number”更新。
你可以这样做:
result = Main.objects.filter(
name="John", month='apr'
).values_list('number', flat=True)
number = str()
count = len(result)
for index, r in enumerate(result):
number += str(r) + '+' if count != index + 1 else str(r)
Bmo.objects.filter(name="test", month='apr').update(number = number)
让我向您展示我已经成功完成的事情以及我现在正在努力实现的目标。
我有 2 个模型。两者都有相同的 3 个字段。姓名、月份、编号。两个型号分别是Main和BMO。
我根据名称和月份筛选第一个模型,并获得数字列的值列表。代码看起来像这样-
result= Main.objects.filter(name="John", month='apr').values_list('number', flat=True)
然后我用 for 循环和条件在 django 模板上显示它。代码看起来像这样 -
<p>result:
<span>
{% for i in result %}
{{i}}{% if not forloop.last %}+{% endif %}
{% endfor %}
</span>
</p>
result = 2+4+12+7+18
最后一行向您展示了它在模板上的实际外观。你可以看到我在值之间用 + 号显示它。
我想达到的目标:
我想获得相同的值列表,但我不想在模板上显示它,而是想将它插入到另一个模型的字段中。需要明确的是,我希望将所有带有加号的值(它在我的模板上的显示方式)插入到第二个模型 BMO 的单个字段中。如果我有 10 个值,它们都应该用加号连接并添加到一个字段中,而不是分散到一列的 10 行中。
这是我尝试过的:
我根据名称和月份筛选了第二个模型 BMO,并尝试使用 .update() 方法更新数字。我在第一行代码正下方的 views.py 中添加了以下代码行。我根本没有使用模板。
result= Main.objects.filter(name="John", month='apr').values_list('number', flat=True)
Bmo.objects.filter(name="test", month='apr).update(number = result)
它没有更改或添加任何内容。所以我尝试了一行带有 for 循环的新代码,就像这样 -
result= Main.objects.filter(name="John", month='apr').values_list('number', flat=True)
for i in result:
Bmo.objects.filter(name__icontains = 'test').update(number = i)
这也没有改变任何事情。只有 1 行名称为 'test',所以我没有使用月份过滤器。并不完全相信 for 循环,但我之前已经成功更新了名称与此确切代码匹配的类别,所以我认为这可能有效。不同之处在于类别是单个字符串,如 category='personal' 而不是本例中的变量或多个变量。
我认为我非常接近实现我想要的,只需一行或两行代码。如果有更简单的方法来做我想做的事情,我会洗耳恭听。感谢您的任何意见。
更新:
在得到 Ahtisham 的答复后,我更新了代码。但不幸的是,它并没有改变任何东西。我正在同一模型中尝试。什么都没坏。控制台中没有错误。我 运行 代码没有任何反应。下面是 views.py 的主要部分:
def index(request):
form = BmoForm()
if request.method == 'POST':
form = BmoForm(request.POST)
if form.is_valid():
form.save()
R = Bmo.objects.all()
var="apr"
result = Bmo.objects.filter(name="Transfer", month=var).values_list('number', flat=True)
number = str()
count = len(products1)
new = 12+3
for index, r in enumerate(products1):
number +=str(r) + '+' if count != index+1 else str(r)
Bmo.objects.filter(name = "test", month = "apr").update(number = number)
变量“new”仅用于测试。当我硬编码要更新的变量时,它起作用了。但它不会用变量“number”更新。
你可以这样做:
result = Main.objects.filter(
name="John", month='apr'
).values_list('number', flat=True)
number = str()
count = len(result)
for index, r in enumerate(result):
number += str(r) + '+' if count != index + 1 else str(r)
Bmo.objects.filter(name="test", month='apr').update(number = number)