当目标模型是django中的元组时,如何建模多对多关系?

时间:2017-02-02 09:25:20

标签: django many-to-many

我有一个带有翻译文本字段的模型。现在的问题是我经常没有“某些”语言的翻译,而且我喜欢发布模型。

简单(默认)ay out是回退到默认语言(根据django模型翻译)但实际上我正在考虑明确启用语言的实例。为此,我喜欢与设置中的LANGUAGES元组建立多对多的关系。所以基本上它就像一个CharField,其选择设置为LANGUAGES,然后选择多种方式。

一个想法是为此添加语言模型并创建标准的ManyToMany关系;但它感觉不对,因为除了语言代码本身我没有任何补充;那么为什么要添加一个模型......

另一种方法是应用PickleField并序列化[]语言代码。但这显然是一个快速/肮脏的解决方案,因为没有验证等......

有人对此问题有任何想法吗?

3 个答案:

答案 0 :(得分:0)

如果你正在使用Postgres,你可以使用ArrayField来映射到db的内置数组支持,以存储所选语言代码的列表。

如果没有,编写一个自定义字段可以相对简单,该字段存储逗号分隔的代码列表并将其转换为列表或从列表中转换 - 可能已存在第三方实现。

答案 1 :(得分:0)

您可以使用JSON将语言代码列表转换为字符串并将其存储为字符串。为此,您可以在模型中添加模型方法。

import json

class Product(models.Model):
    languages = models.CharField(max_length=200)

    def set_languages(self, list_of_language_codes):
        self.languages = json.dumps(list_of_language_codes)

    @property
    def get_languages(self):
        return json.loads(self.languages)

然后,在保存对象后,使用语言代码列表调用set_languages()方法 -

object.set_languages(list_if_language_codes)    
object.save()

答案 2 :(得分:0)

嗯,我找到了一个非常简单的解决方案,并且可以在管理员视图中进行控制+我甚至可以查询是否为特定语言启用了实例。

解决方案由模型翻译本身提供(django-modeltranslation.readthedocs.io/en/latest / ...),如果您只是创建一个布尔字段并且注册而不是要翻译的字段,那么您将获得一个enabled_字段每个....!

class <model>TranslationOptions(TranslationOptions):
    fields = ('name', 'slug', 'enabled', ...)

translator.register(...