如何使用不同的查询集来避免 label_from_instance 中的重复值?

How to use queryset with distinct to avoid duplication value in label_from_instance?

我想将 querysetdistinct() 一起使用以避免 label_from_instance 中的重复值。

但是我遇到如下错误。

'str' object has no attribute 'name'

如何在 label_from_instance 中将 querysetdistinct() 一起使用?


下面是 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”,如果有多个 MyModels 以“foo”作为名称,那么应该选择哪个:通过使一个独特的,你因此“破坏”了反向链接到原始项目的方式。标签应该足以规范地指定要使用的模型项目。

你应该解决另一端的问题:防止一个人可以使用多个 MyModels 与相同的 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