如何从多个 m2m 文件中为查询集select2准备一个列表

问题描述

我的一个模型有三列是 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,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['colour__name'])])}
            sku.append(att)

输出 sku:

[{'id': '108-32-B-Grey','text': '32-B-Grey'},{'id': '108-32-C-Grey','text' : '32-C-Grey'},{'id': '108-32-B-White','text': '32-B-White'},{'id': '108-32-C-白色','text': '32-C-White'},{'id': '108-34-B-Grey','text': '34-B-Grey'},{'id': ' 108-34-C-灰色','文本' : '34-C-Grey'},{'id': '108-34-B-White','text': '34-B-White'},{'id': '108-34-C- White','text': '34-C-White'}]

更新:

self.fields['product_attr'].queryset = ProductAttributes.objects.filter(product_id=108).values("id").annotate(
                id_dummy=Concat(
                    'product',V('-'),'cupsize__name',output_field=CharField()
                ),text=Concat(
                    'size__name',output_field=CharField()
                )
            ).values("id_dummy","text").annotate(id=F('id_dummy')).values_list("id","text")

解决方法

您可以使用 ConcatValue() 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','cupsize__name','colour__name',output_field=CharField()
    ),text=Concat(
        'size__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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...