【问题标题】:Editing the queryset of django models编辑 Django 模型的查询集
【发布时间】:2017-11-22 17:49:47
【问题描述】:

我有以下型号和形式:

# Model
class Fruit(...):
    name = models.CharField(...)       # Default name of the fruit
    engName = models.CharField(...)    # English name

    def __str__(self):
        return self.name


# Form
class ComboProductForm(forms.ModelForm):
    fruit =  forms.ModelChoiceField(queryset=Fruit.objects.none())

    def __init__(self, *args, **kwargs):
        branch = kwargs.pop('branch')
        fruits = Fruit.objects.filter(branch=branch)    # Branch of the company
        self.fields['fruit'].queryset = fruits

公司的每个分公司都有不同的水果,所以我必须在__init__方法中过滤水果。我想要的是根据request.LANGUAGE_CODE修改查询集:

    def __init__(self, *args, **kwargs):
        branch = kwargs.pop('branch')
        language = kwargs.pop('language')
        fruits = Fruit.objects.filter(branch=branch)    # Branch of the company
        if language == 'en':
            for fruit in fruits:
                fruit.name = fruit.engName
        self.fields['fruit'].queryset = fruits

也就是说,如果语言代码是英文,则显示英文水果名称。但是,生成的fruits 的内容似乎没有改变。如何修改查询集?

我也尝试了以下方法:

fruits = list(fruits)
for fruit in fruits:
    fruit.name = fruit.engName

但是我必须将fruits 转换回查询集类型。我该怎么做,这会奏效吗?

我也在考虑在模型方法__str__中返回不同的字段:

def __str__(self):
    if language_code == 'English':    # Hypothetical statement
        return self.name
    return self.engName

但不知道该怎么做。请帮忙,谢谢。

【问题讨论】:

    标签: django-models django-forms django-queryset


    【解决方案1】:

    试试这个:

    class ComboProductForm(forms.ModelForm):
        fruit =  forms.ModelChoiceField(queryset=Fruit.objects.none())
    
        def __init__(self, *args, **kwargs):
            branch = kwargs.pop('branch')
            language = kwargs.pop('language')
            fruits = Fruit.objects.filter(branch=branch)    # Branch of the company
            self.fields['fruit'].queryset = fruits
            self.fields['fruit'].label_from_instance = self.label_from_instance(language)
    
        @staticmethod
        def label_from_instance(obj, language):
            if language == 'en':
                return obj.engName
            return obj.name
    

    【讨论】:

    • 这里是错误信息:label_from_instance() missing 1 required positional argument: 'language
    【解决方案2】:

    受 Raj 的启发,我想出了以下解决方案:

    def __init__(self, *args, **kwargs):
        branch = kwargs.pop('branch')
        language = kwargs.pop('language')
        fruits = Fruit.objects.filter(branch=branch)    # Branch of the company
        self.fields['fruit'].queryset = fruits
        if language == 'en':
            self.fields['fruit'].label_from_instance = lambda obj: "%s" % obj.engName
    

    【讨论】:

    • 这种方法更简单更好
    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2020-11-14
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多