Python 如何在django中一次创建多个具有不同值的对象?

Python 如何在django中一次创建多个具有不同值的对象?,python,django,django-views,django-templates,Python,Django,Django Views,Django Templates,我需要从一个模板创建两个模型。创建产品模型很好。产品模型与产品变量之间存在多方面的关系。但我在创建ProductVariant模型时遇到了问题。 request.POST.getlist('names')这给了我这样的结果['name1'、'name2],所有的结果都是一样的。 我想用每个值创建ProductVariant对象。我该怎么做?此外,我认为在选择存储字段时出现问题request.POST.getlist('attributes')给出的值如下所示['a:b','x:z'],因此我将其

我需要从一个模板创建两个模型。创建产品模型很好。产品模型与产品变量之间存在多方面的关系。但我在创建ProductVariant模型时遇到了问题。
request.POST.getlist('names')
这给了我这样的结果
['name1'、'name2
],所有的结果都是一样的。 我想用每个值创建ProductVariant对象。我该怎么做?此外,我认为在选择存储字段时出现问题
request.POST.getlist('attributes')
给出的值如下所示
['a:b','x:z']
,因此我将其转换为dictionary(但不确定它是否有效)

更新:

我想要的是
属性
名称
。。。列表中所有项目的数量都相同。 例如,如果名称是
['a','b','c']
,那么权重在列表中也将有3个值
[12,15,23]
,如下所示。 我想创建
ProductVariant
对象3次,因为每个列表中都有3个项目。第一个对象将具有列表第一项中的字段值,即
name=a,weight=12..
,第二个对象的值将是
name=b,weight=15
,如下所示

怎么可能呢?或者我应该改变逻辑?有什么建议吗? 模型

观点


至于属性,可以简化为一行,如下所示:

attributes_dict = dict(map(lambda x: x.split(':'), attributes))
class ProductVariantForm(forms.ModelForm):
    class Meta:
        fields = ('name', 'product', 'attributes', 'price')
        model = ProductVariant


ProductVariantFormSet = formset_factory(ProductVariantForm)
要创建多个对象,您应该一次迭代并创建一个对象,或者使用
bulk\u create

for name in names:
    ProductVariant.objects.create(name=name,...)


至于属性,可以简化为一行,如下所示:

attributes_dict = dict(map(lambda x: x.split(':'), attributes))
class ProductVariantForm(forms.ModelForm):
    class Meta:
        fields = ('name', 'product', 'attributes', 'price')
        model = ProductVariant


ProductVariantFormSet = formset_factory(ProductVariantForm)
要创建多个对象,您应该一次迭代并创建一个对象,或者使用
bulk\u create

for name in names:
    ProductVariant.objects.create(name=name,...)


最佳做法是使用
bulk\u create
方法

product_variants=[ProductVariant(name=name)表示名称中的名称]
ProductVariant.objects.bulk\u创建(产品变量)

最佳做法是使用
批量创建方法

product_variants=[ProductVariant(name=name)表示名称中的名称]
ProductVariant.objects.bulk\u创建(产品变量)
更新答案:

names=['a','b','c']
权重=[12,15,23]
params=zip(名称、权重)
products=[ProductVariant(名称=参数[0],重量=参数[1]),用于参数中的参数]
ProductVariant.objects.bulk\u创建(产品)
更新答案:

names=['a','b','c']
权重=[12,15,23]
params=zip(名称、权重)
products=[ProductVariant(名称=参数[0],重量=参数[1]),用于参数中的参数]
ProductVariant.objects.bulk\u创建(产品)

我不同意这种方法,但如果你真的想这样做,
zip
ing将是@forkcs指出的方法

我会用Django来尽可能地帮助我,在我到达那里之前,请做这个改变。浮动!=钱

完成后,表单应如下所示:

attributes_dict = dict(map(lambda x: x.split(':'), attributes))
class ProductVariantForm(forms.ModelForm):
    class Meta:
        fields = ('name', 'product', 'attributes', 'price')
        model = ProductVariant


ProductVariantFormSet = formset_factory(ProductVariantForm)
注意,我不必解析/清理/格式化
属性
?那是因为Django是为我做的;)

如果你给你的字段命名并且多次不使用同一个名称,你可以这样使用它:(你不是把所有的字段都称为“属性”,而是把它们称为“form-X-attributes”,其中X是数字0-infinity,)

对于额外的学分,你也可以这样做:(这其实不重要)

你得到了什么?标准!!!和条块分割!每个认识Django的人都知道你做了什么。所有干净的逻辑都将放在正确的位置(表单),这样就不容易出错

另外,我为你写了测试。
如果您想了解更多关于我的方法的信息,请参阅文档

我不同意这种方法,但如果您真的想这样做,
zip
ing将是@forkcs指出的方法

我会用Django来尽可能地帮助我,在我到达那里之前,请做这个改变。浮动!=钱

完成后,表单应如下所示:

attributes_dict = dict(map(lambda x: x.split(':'), attributes))
class ProductVariantForm(forms.ModelForm):
    class Meta:
        fields = ('name', 'product', 'attributes', 'price')
        model = ProductVariant


ProductVariantFormSet = formset_factory(ProductVariantForm)
注意,我不必解析/清理/格式化
属性
?那是因为Django是为我做的;)

如果你给你的字段命名并且多次不使用同一个名称,你可以这样使用它:(你不是把所有的字段都称为“属性”,而是把它们称为“form-X-attributes”,其中X是数字0-infinity,)

对于额外的学分,你也可以这样做:(这其实不重要)

你得到了什么?标准!!!和条块分割!每个认识Django的人都知道你做了什么。所有干净的逻辑都将放在正确的位置(表单),这样就不容易出错

另外,我为你写了测试。
如果您想了解有关我的方法的更多信息,请参阅文档

我必须使用
for loop
不仅用于名称,还用于其他值。通过批量创建,我可以在
之后使用其他循环for name in names
吗?像这样
ProductVariant.objects.bulk\u创建([ProductVariant(name=name,price=p)代表name in name for p in up])
然后更好地陈述您的问题。你们可以在循环中使用你们想要的任何东西,并没有人,也并没有任何东西能束缚你们。请阅读文档:然后再次更好地描述您的问题。更新帖子,说明问题,显示日志,解释所需结果。我必须使用
for循环
不仅用于名称,还用于其他值。通过批量创建,我可以在
for name in name
之后使用其他循环吗?像这样
ProductVariant.objects.bulk\u创建([ProductVariant(name=name,price=p)代表name in name for p in up])
然后更好地陈述您的问题。你们可以在循环中使用你们想要的任何东西,并没有人,也并没有任何东西能束缚你们。请阅读文档:然后再次更好地描述您的问题。更新帖子,说明问题,显示日志,解释所需结果。如果你有多种方法,请参考发布1答案,而不是发布多个答案。如果你有多种方法而不是po,请参考发布1答案