如何按变量字段排序?

时间:2017-12-26 17:29:39

标签: django model

我创建了一个自定义MultilingualCharField,我希望用正确的语言对它进行排序。我更喜欢在模型中这样做(告诉我这不是一个好主意),是否可能?

class Myclass(models.Model):
    name = MultilingualCharField(max_length=32, unique=True)
    ...

def __str__(self):
    name_traslated={'name_it': self.name_it, 'name_en': self.name_en}
    name_verbose=_('name_it')
    return name_traslated[name_verbose]

class Meta:
    #name_traslated={'name_it': self.name_it, 'name_en': self.name_en}
    name_verbose=_('name_it')
    ordering = [name_verbose]
    #ordering = [name_traslated[name_verbose]]

__str__正在运作,但ordering不是:它提供TypeError: 'class Meta' got invalid attribute(s): name_verbose

我的MultilingualCharField创建了两列:name_itname_en,我想在其中一列上订购istances。如果你需要它,那么代码(来自使用Django Cookbook的Web开发):

class MultilingualCharField(models.CharField):

def __init__(self, verbose_name=None, **kwargs):
    self._blank = kwargs.get("blank", False)
    self._editable = kwargs.get("editable", True)
    #super(MultilingualCharField, self).__init__(verbose_name, **kwargs)
    super().__init__(verbose_name, **kwargs)

def contribute_to_class(self, cls, name, virtual_only=False):
    # generate language specific fields dynamically
    if not cls._meta.abstract:
        for lang_code, lang_name in settings.LANGUAGES:
            if lang_code == settings.LANGUAGE_CODE:
                _blank = self._blank
            else:
                _blank = True
            localized_field = models.CharField(string_concat(
                self.verbose_name, " (%s)" % lang_code),
                name=self.name,
                primary_key=self.primary_key,
                max_length=self.max_length,
                unique=self.unique,
                blank=_blank,
                null=False,
                # we ignore the null argument!
                db_index=self.db_index,
                rel=self.rel,
                default=self.default or "",
                editable=self._editable,
                serialize=self.serialize,
                choices=self.choices,
                help_text=self.help_text,
                db_column=None,
                db_tablespace=self.db_tablespace
            )
            localized_field.contribute_to_class(cls, 
                "%s_%s" % (name, lang_code),)

    def translated_value(self):
        language = get_language()
        val = self.__dict__["%s_%s" % (name, language)]
        if not val:
            val = self.__dict__["%s_%s" % (name, settings.LANGUAGE_CODE)]
            return val

    setattr(cls, name, property(translated_value))

谢谢

1 个答案:

答案 0 :(得分:0)

我有一个带有字段name的模型。我的自定义MultilingualCharField在数据库中为每种语言(name_enname_it等创建了一个字段。我在数据库中有一个字段name,但只在模型中。

所以,这就是我所做的(即使您不使用自定义字段,但模型中的每种语言都有字段,我认为也很有用):

mymodel.py

class MyClass(models.Model):
    ...
    class Meta:
        ordering = [_('name_it')]

这适用于表格等,但在管理员(TypeError: expected string or bytes-like object)中出错,所以这是我的Admin.py

class MyClassAdmin(admin.ModelAdmin):
    def get_ordering(self, request):
        if get_language_from_request(request)=='it':
            return ['name_it']
        else:
            return ['name_en']

如果您发现错误或更好的方式,请告诉我