如何使用不同的查询集来避免 label_from_instance 中的重复值?
How to use queryset with distinct to avoid duplication value in label_from_instance?
我想将 queryset
与 distinct()
一起使用以避免 label_from_instance
中的重复值。
但是我遇到如下错误。
'str' object has no attribute 'name'
如何在 label_from_instance
中将 queryset
与 distinct()
一起使用?
下面是 forms.py 中的代码:
from django.forms import ModelChoiceField
class NameChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return f'{obj.name}'
class MyModelForm(forms.ModelForm):
code = NameChoiceField(queryset=MyModel.objects.all().values_list('name',flat=True).order_by('name').distinct())
python 3.8
Django 3.2
Mysql 5.7
How could I use queryset with distinct()
in label_from_instance?
你不会。想象一下,您使用 .distinct()
并因此获得了唯一的名称,并且一个人选择了一个选项“foo”,如果有多个 MyModel
s 以“foo”作为名称,那么应该选择哪个:通过使一个独特的,你因此“破坏”了反向链接到原始项目的方式。标签应该足以规范地指定要使用的模型项目。
你应该解决另一端的问题:防止一个人可以使用多个 MyModel
s 与相同的 name
,你可以将 name
字段标记为唯一的,从而与:
一起工作
class MyModel(models.Model):
name = models.CharField(max_length=128<strong>, unique=True</strong>)
# …
例如,项目也可能 每个用户 是唯一的。在那种情况下,你构造一个 UniqueConstraint
[Django-doc] with:
from django.conf import settings
class MyModel(models.Model):
name = models.CharField(max_length=128)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
class Meta:
constraints = [
models.<strong>UniqueConstraint(</strong>fields=('name', 'user'), name='unique_name_per_user'<strong>)</strong>
]
在这种情况下,您可以使用 user
过滤表单中的查询集:
class MyModelForm(forms.ModelForm):
code = NameChoiceField(queryset=MyModel.objects.order_by('name'))
def __init__(self, *args<strong>, user=None</strong>, **kwargs):
super().__init__(*args, **kwargs)
if user is not None:
self.field['code'].queryset = MyModel.objects.filter(
<strong>user=user</strong>
).order_by('name')
然后你用 MyModelForm(<b>user=request.user</b>)
构造 MyModelForm
。
我想将 queryset
与 distinct()
一起使用以避免 label_from_instance
中的重复值。
但是我遇到如下错误。
'str' object has no attribute 'name'
如何在 label_from_instance
中将 queryset
与 distinct()
一起使用?
下面是 forms.py 中的代码:
from django.forms import ModelChoiceField
class NameChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return f'{obj.name}'
class MyModelForm(forms.ModelForm):
code = NameChoiceField(queryset=MyModel.objects.all().values_list('name',flat=True).order_by('name').distinct())
python 3.8
Django 3.2
Mysql 5.7
How could I use queryset with
distinct()
in label_from_instance?
你不会。想象一下,您使用 .distinct()
并因此获得了唯一的名称,并且一个人选择了一个选项“foo”,如果有多个 MyModel
s 以“foo”作为名称,那么应该选择哪个:通过使一个独特的,你因此“破坏”了反向链接到原始项目的方式。标签应该足以规范地指定要使用的模型项目。
你应该解决另一端的问题:防止一个人可以使用多个 MyModel
s 与相同的 name
,你可以将 name
字段标记为唯一的,从而与:
class MyModel(models.Model):
name = models.CharField(max_length=128<strong>, unique=True</strong>)
# …
例如,项目也可能 每个用户 是唯一的。在那种情况下,你构造一个 UniqueConstraint
[Django-doc] with:
from django.conf import settings
class MyModel(models.Model):
name = models.CharField(max_length=128)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
class Meta:
constraints = [
models.<strong>UniqueConstraint(</strong>fields=('name', 'user'), name='unique_name_per_user'<strong>)</strong>
]
在这种情况下,您可以使用 user
过滤表单中的查询集:
class MyModelForm(forms.ModelForm):
code = NameChoiceField(queryset=MyModel.objects.order_by('name'))
def __init__(self, *args<strong>, user=None</strong>, **kwargs):
super().__init__(*args, **kwargs)
if user is not None:
self.field['code'].queryset = MyModel.objects.filter(
<strong>user=user</strong>
).order_by('name')
然后你用 MyModelForm(<b>user=request.user</b>)
构造 MyModelForm
。