Python Django ChoiceField中的重复值

Python Django ChoiceField中的重复值,python,django,Python,Django,我是Django的新手,对forms.py有问题。我通过Models.Py从数据库中提取值,然后在Django页面上使用这些对象作为下拉列表 例如,我将汽车数据存储在数据库中: 本田|雅阁|黑色| 2016 丰田|凯美瑞|红色| 2014 福特| Fusion | White | 2018 本田|思域|银牌| 2020 丰田|花冠|黑色| 2010 等等。在models.py中,我有: class MyCars(models.Model): make_name = models.Cha

我是Django的新手,对forms.py有问题。我通过Models.Py从数据库中提取值,然后在Django页面上使用这些对象作为下拉列表

例如,我将汽车数据存储在数据库中:

本田|雅阁|黑色| 2016

丰田|凯美瑞|红色| 2014

福特| Fusion | White | 2018

本田|思域|银牌| 2020

丰田|花冠|黑色| 2010

等等。在models.py中,我有:

class MyCars(models.Model):

    make_name = models.CharField(max_length=50, blank=True, null=True)
    model_name = models.CharField(max_length=50, blank=True, null=True)
    color = models.CharField(max_length=15, blank=True, null=True)
    year = models.CharField(max_length=15, blank=True, null=True)


    def __str__(self):
        all_cars = []
        return self.make_name

    class Meta:
        managed = False
        db_table = 'my_cars'
然后在我的form.py中,我做了以下几点:

all_cars = forms.ModelChoiceField(queryset=MyCars.objects.all())

问题是,当我只需要本田在下拉列表中出现一次时,我将有本田、丰田等的重复值。有什么建议/想法可以过滤吗?

如果您使用的是
PostgreSQL
,请更改

all\u cars=forms.modelcoocefield(queryset=MyCars.objects.all())


all\u cars=forms.modelcoocefield(queryset=MyCars.objects.distinct(“model\u name”))
如果您使用的是
PostgreSQL
,请更改

all\u cars=forms.modelcoocefield(queryset=MyCars.objects.all())


all\u cars=forms.ModelChoiceField(queryset=MyCars.objects.distinct(“model\u name”))
您必须在forms.py中过滤查询。目前,您正在使用MyCars.objects.all()抓取所有内容。不确定确切的语法,但Django文档是一个很好的地方。

如果我没记错的话,它是清晰的,但不是100%确定的。

您必须在forms.py中过滤查询。目前,您正在使用MyCars.objects.all()抓取所有内容。不确定确切的语法,但Django文档是一个很好的地方。

如果我没记错的话,它是清晰的,但不是100%确定的。

您似乎面临着表格未规范化的问题。考虑到许多汽车可能有相同的品牌,随着时间的推移可能会有新的品牌,你真的应该有一个型号用于品牌,并有一个从
MyCars
make
的外键

class Make(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True)
    
    def __str__(self):
        return self.name

class MyCars(models.Model):
    make = models.ForeignKey(Make, on_delete=models.CASCADE, related_name="cars")
    model_name = models.CharField(max_length=50, blank=True, null=True)
    color = models.CharField(max_length=15, blank=True, null=True)
    year = models.CharField(max_length=15, blank=True, null=True)


    def __str__(self):
        all_cars = []
        return self.make_name

    class Meta:
        managed = False
        db_table = 'my_cars'
现在以您的形式:

all_cars = forms.ModelChoiceField(queryset=Make.objects.all())

此外,名称
MyCars
应为单数(
MyCar
),因为型号名称应为单数(检查
verbose\u name
verbose\u name\u multiple
),在您的情况下
verbose\u name\u multiple
最终成为
MyCars
)。

看起来您面临着表格未规范化的问题。考虑到许多汽车可能有相同的品牌,随着时间的推移可能会有新的品牌,你真的应该有一个型号用于品牌,并有一个从
MyCars
make
的外键

class Make(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True)
    
    def __str__(self):
        return self.name

class MyCars(models.Model):
    make = models.ForeignKey(Make, on_delete=models.CASCADE, related_name="cars")
    model_name = models.CharField(max_length=50, blank=True, null=True)
    color = models.CharField(max_length=15, blank=True, null=True)
    year = models.CharField(max_length=15, blank=True, null=True)


    def __str__(self):
        all_cars = []
        return self.make_name

    class Meta:
        managed = False
        db_table = 'my_cars'
现在以您的形式:

all_cars = forms.ModelChoiceField(queryset=Make.objects.all())

此外,名称
MyCars
应为单数(
MyCar
),因为型号名称应为单数(检查
verbose\u name
verbose\u name\u复数
,在您的情况下
verbose\u name\u复数
最终为
MyCars
)。

您没有重复项,您的问题是,您的str函数返回self.make_name,因此,您的查询集是完整的汽车列表,由于丰田凯美瑞和丰田花冠具有相同的make_name,您会看到它们具有相同的名称,但在背面,您只是显示了该属性。您可以在查询上使用distinct函数来更改属性,也可以直接在您的车型上更改str函数以适应您的需要(您可以连接多个属性)。这里有一个例子:

def __str__(self):
    all_cars = []
    return f"${self.make_name} - {self.model_name}"

您没有重复的,问题是您的str函数返回self.make_name,因此,您的查询集是完整的汽车列表,由于丰田凯美瑞和丰田花冠具有相同的make_name,您会看到它们具有相同的名称,但在背面,您只是显示了该属性。您可以在查询上使用distinct函数来更改属性,也可以直接在您的车型上更改str函数以适应您的需要(您可以连接多个属性)。这里有一个例子:

def __str__(self):
    all_cars = []
    return f"${self.make_name} - {self.model_name}"

是否仅选择make_名称?或者
是否正确?否-我想将品牌和型号分开您只想选择品牌名称吗?或者
是否正确?否-我想将品牌和型号分开谢谢-这至少为我指明了正确的方向。不幸的是,MySQL似乎不支持。还有其他想法吗?
raw sql
notation
按计数和
filter
小于2。谢谢-这至少为我指明了正确的方向。不幸的是,MySQL似乎不支持。还有其他想法吗?
raw sql
notation
按计数和
filter
小于2。感谢您的提示。如果我理解正确,这将需要一个新的汽车制造数据库,以便在表单中为“所有汽车”添加值?否则将返回空值?@MC2020是否创建新数据库?否。是否在同一数据库中创建新表?对此外,您还需要为make model/make表单创建条目,以便用户创建实体。在最终确定模型之前,应该始终对其进行规范化(搜索数据库规范化)。此外,您还可以根据我的建议进行一些明显的改进,例如在
make
模型中的
name
字段上设置
unique=True
,等等。对-我指的是一个新表。谢谢你的帮助@MC2020注意到,上述实施仍然没有规范化。例如,可以将模型名称(可能会有重复的值)拆分到单独的表中。谢谢提示。如果我理解正确,这将需要一个新的汽车制造数据库,以便在表单中为“所有汽车”添加值?否则将返回空值?@MC2020是否创建新数据库?否。是否在同一数据库中创建新表?对此外,您还需要为用户创建模型/创建表单创建条目