Python Django ChoiceField中的重复值
我是Django的新手,对forms.py有问题。我通过Models.Py从数据库中提取值,然后在Django页面上使用这些对象作为下拉列表 例如,我将汽车数据存储在数据库中: 本田|雅阁|黑色| 2016 丰田|凯美瑞|红色| 2014 福特| Fusion | White | 2018 本田|思域|银牌| 2020 丰田|花冠|黑色| 2010 等等。在models.py中,我有: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
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是否创建新数据库?否。是否在同一数据库中创建新表?对此外,您还需要为用户创建模型/创建表单创建条目