您将如何继承并覆盖django模型类以创建listOfStringsField?

gri*_*eve 8 python django inheritance django-models

我想为django模型创建一个新类型的字段,它基本上是一个ListOfStrings.因此,在您的模型代码中,您将拥有以下内容:

models.py:

from django.db import models

class ListOfStringsField(???):
    ???

class myDjangoModelClass():
    myName = models.CharField(max_length=64)
    myFriends = ListOfStringsField() # 
Run Code Online (Sandbox Code Playgroud)

other.py:

myclass = myDjangoModelClass()
myclass.myName = "bob"
myclass.myFriends = ["me", "myself", "and I"]

myclass.save()

id = myclass.id

loadedmyclass = myDjangoModelClass.objects.filter(id__exact=id)

myFriendsList = loadedclass.myFriends
# myFriendsList is a list and should equal ["me", "myself", "and I"]
Run Code Online (Sandbox Code Playgroud)

您将如何编写此字段类型,并遵循以下规定?

  • 我们不想做创建刚刚CRAMS所有串在一起,并像一个领域的令牌将它们分开场这个.在某些情况下,这是一个很好的解决方案,但我们希望保持字符串数据的标准化,以便django以外的工具可以查询数据.
  • 该字段应自动创建存储字符串数据所需的任何辅助表.
  • 理想情况下,辅助表应该只包含每个唯一字符串的一个副本.这是可选的,但是很高兴.

看看Django代码看起来我想要做类似于ForeignKey正在做的事情,但文档很稀疏.

这导致以下问题:

  • 可以这样做吗?
  • 它已经完成(如果是这样的话)?
  • 关于如何扩展和覆盖他们的模型类,特别是他们的关系类,是否有关于Django的文档?我没有看到很多关于他们代码方面的文档,但是有这个.

这是来自这个问题.

Dan*_*man 6

有一个关于创建自定义字段的一些很好的文档在这里.

但是,我认为你是在思考这个问题.听起来你实际上只是想要一个标准的外键,但是能够将所有元素作为单个列表检索.所以最简单的get_myfield_as_list方法就是使用ForeignKey,并在模型上定义一个方法:

class Friends(model.Model):
    name = models.CharField(max_length=100)
    my_items = models.ForeignKey(MyModel)

class MyModel(models.Model):
    ...

    def get_my_friends_as_list(self):
        return ', '.join(self.friends_set.values_list('name', flat=True))
Run Code Online (Sandbox Code Playgroud)

现在调用get_my_friends_as_list()MyModel的实例将根据需要返回一个字符串列表.


mma*_*one 5

我也认为你这是错误的做法.试图让Django字段创建一个辅助数据库表几乎肯定是错误的方法.如果你试图使你的解决方案普遍有用,那将很难做到,并且可能会使第三方开发人员感到困惑.

如果你试图在一个列中存储非规范化的blob数据,我会采用类似于你链接的方法,序列化Python数据结构并将其存储在TextField中.如果您希望Django以外的工具能够对数据进行操作,那么您可以序列化为JSON(或其他一些具有广泛语言支持的格式):

from django.db import models
from django.utils import simplejson

class JSONDataField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if value is None: 
            return None
        if not isinstance(value, basestring): 
            return value
        return simplejson.loads(value)

    def get_db_prep_save(self, value):
        if value is None: 
            return None
        return simplejson.dumps(value)
Run Code Online (Sandbox Code Playgroud)

如果您只想要一个类似django Manager的描述符,它允许您操作与模型关联的字符串列表,那么您可以手动创建连接表并使用描述符来管理关系.这不完全是你需要的,但这段代码应该让你开始.


rob*_*rob 5

你所描述的对我来说听起来与标签非常相似.
那么,为什么不使用django标记呢?
它就像一个魅力,你可以独立于你的应用程序安装它,它的API非常容易使用.