如何从多个 m2m 字段中为查询集 (select2) 准备列表
How to prepare a list for queryset (select2) from multiple m2m filed
我的一个模型有三列是 M2M 字段,这三个 M2M 字段中的每一个都有不同的模型。
我想从此 product attribute
模型获取数据集,如下面的输出 SQU 所示。这是我想要作为模型形式的 queryset
获得的数据集。
如果有人能告诉我如何做到这一点,我将不胜感激。或者我不确定模型设计是否适合获取这样的数据集,因为我是 Django 的新手。
class ProductAttributes(models.Model):
product = models.ForeignKey('Product', blank=True, null=True, on_delete=models.SET_NULL)
size = models.ManyToManyField('ProductSize', related_name = "productsize")
colour = models.ManyToManyField('ProductColour', related_name="productcolour")
cupsize = models.ManyToManyField('ProductCupSize', related_name="productcupsize")
class ProductSize(models.Model):
name = models.CharField(max_length=10)
class ProductColour(models.Model):
name = models.CharField(max_length=25)
colour = models.CharField(max_length=15, blank=True, null=True)
class ProductCupSize(models.Model):
name = models.CharField(max_length=1)
我从这三个模型查询数据的方式。
attrs = ProductAttributes.objects.filter(product=product_id).values('product', 'size__name', 'colour__name',
'cupsize__name')
sku = []
for attr in attrs:
att = {'id': '-'.join([str(attr['product']), str(attr['size__name']), str(attr['cupsize__name']),
str(attr['colour__name'])]),
'text': '-'.join(
[str(attr['size__name']), str(attr['cupsize__name']), str(attr['colour__name'])])}
sku.append(att)
输出sku:
[{'id': '108-32-B-灰色', 'text': '32-B-灰色'}, {'id': '108-32- C-灰色', 'text': '32-C-灰色'}, {'id': '108-32-B-白色', 'text': '32-B-白色' }, {'id': '108-32-C-白', 'text': '32-C-白'}, {'id': '108-34-B-灰' , 'text': '34-B-灰色'}, {'id': '108-34-C-灰色', 'text'
: '34-C-灰色'}, {'id': '108-34-B-白色', 'text': '34-B-白色'}, {'id': ' 108-34-C-白', 'text': '34-C-白'}]
更新:
self.fields['product_attr'].queryset = ProductAttributes.objects.filter(product_id=108).values("id").annotate(
id_dummy=Concat(
'product', V('-'), 'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
),
text=Concat(
'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
)
).values("id_dummy", "text").annotate(id=F('id_dummy')).values_list("id", "text")
你可以用 Concat and Value() expressions
下面的代码应该可以满足您的需求:
from django.db.models import CharField, F, Value as V
from django.db.models.functions import Concat
attrs = list(ProductAttributes.objects.values("id").annotate(
id_dummy=Concat(
'product', V('-'), 'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
),
text=Concat(
'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
)
).values("id_dummy", "text").annotate(id=F('id_dummy')).values_list("id", "text")
在你的位置我会使用django-select2
my_choice = forms.ChoiceField(widget=Select2Widget(attrs={'data-placeholder': 'Your placeholder'}), choices=YOURE_CHOICES, required=False)
我的一个模型有三列是 M2M 字段,这三个 M2M 字段中的每一个都有不同的模型。
我想从此 product attribute
模型获取数据集,如下面的输出 SQU 所示。这是我想要作为模型形式的 queryset
获得的数据集。
如果有人能告诉我如何做到这一点,我将不胜感激。或者我不确定模型设计是否适合获取这样的数据集,因为我是 Django 的新手。
class ProductAttributes(models.Model):
product = models.ForeignKey('Product', blank=True, null=True, on_delete=models.SET_NULL)
size = models.ManyToManyField('ProductSize', related_name = "productsize")
colour = models.ManyToManyField('ProductColour', related_name="productcolour")
cupsize = models.ManyToManyField('ProductCupSize', related_name="productcupsize")
class ProductSize(models.Model):
name = models.CharField(max_length=10)
class ProductColour(models.Model):
name = models.CharField(max_length=25)
colour = models.CharField(max_length=15, blank=True, null=True)
class ProductCupSize(models.Model):
name = models.CharField(max_length=1)
我从这三个模型查询数据的方式。
attrs = ProductAttributes.objects.filter(product=product_id).values('product', 'size__name', 'colour__name',
'cupsize__name')
sku = []
for attr in attrs:
att = {'id': '-'.join([str(attr['product']), str(attr['size__name']), str(attr['cupsize__name']),
str(attr['colour__name'])]),
'text': '-'.join(
[str(attr['size__name']), str(attr['cupsize__name']), str(attr['colour__name'])])}
sku.append(att)
输出sku:
[{'id': '108-32-B-灰色', 'text': '32-B-灰色'}, {'id': '108-32- C-灰色', 'text': '32-C-灰色'}, {'id': '108-32-B-白色', 'text': '32-B-白色' }, {'id': '108-32-C-白', 'text': '32-C-白'}, {'id': '108-34-B-灰' , 'text': '34-B-灰色'}, {'id': '108-34-C-灰色', 'text' : '34-C-灰色'}, {'id': '108-34-B-白色', 'text': '34-B-白色'}, {'id': ' 108-34-C-白', 'text': '34-C-白'}]
更新:
self.fields['product_attr'].queryset = ProductAttributes.objects.filter(product_id=108).values("id").annotate(
id_dummy=Concat(
'product', V('-'), 'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
),
text=Concat(
'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
)
).values("id_dummy", "text").annotate(id=F('id_dummy')).values_list("id", "text")
你可以用 Concat and Value() expressions
下面的代码应该可以满足您的需求:
from django.db.models import CharField, F, Value as V
from django.db.models.functions import Concat
attrs = list(ProductAttributes.objects.values("id").annotate(
id_dummy=Concat(
'product', V('-'), 'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
),
text=Concat(
'size__name', V('-'), 'cupsize__name', V('-'), 'colour__name',
output_field=CharField()
)
).values("id_dummy", "text").annotate(id=F('id_dummy')).values_list("id", "text")
在你的位置我会使用django-select2
my_choice = forms.ChoiceField(widget=Select2Widget(attrs={'data-placeholder': 'Your placeholder'}), choices=YOURE_CHOICES, required=False)