目前我的代码中有很多python对象,类似于以下内容:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
现在我想把它变成一个Django模型,其中self.myName是一个字符串字段,self.myFriends是一个字符串列表 .
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
由于列表是python中常见的数据结构,我希望它有一个Django模型字段 . 我知道我可以使用ManyToMany或OneToMany关系,但我希望避免代码中的额外间接 .
Edit:
我添加了这个related question,人们可能觉得它很有用 .
11 回答
这种关系是不是更好地表达为与
Friends
表的一对多外键关系?据我所知,myFriends
仅仅是字符串,但我想一个更好的设计是 Build 一个Friend
模型,并有MyClass
包含一个外键realtionship到结果表 .“过早优化是万恶之源 . ”
牢记这一点,让我们这样做!一旦您的应用程序达到某一点,非正常化数据非常常见 . 如果操作正确,它可以节省大量昂贵的数据库查找,但需要多花一些时间 .
要返回
list
的朋友名称,我们需要创建一个自定义的Django Field类,它将在访问时返回一个列表 .David Cramer posted a guide to creating a SeperatedValueField on his blog . 这是代码:
此代码的逻辑涉及将数据库中的值序列化和反序列化为Python,反之亦然 . 现在,您可以轻松地在模型类中导入和使用我们的自定义字段:
在Django中存储列表的一种简单方法是将其转换为JSON字符串,然后将其保存为模型中的Text . 然后,您可以通过将(JSON)字符串转换回python列表来检索列表 . 这是如何做:
“list”将存储在您的Django模型中,如下所示:
在您的视图/控制器代码中:
Storing the list in the database:
Retrieving the list from the database:
Conceptually, here's what's going on:
由于这是一个老问题,并且Django技术必须发生重大变化,因此,这个答案反映了Django版本1.4,并且最有可能适用于v 1.5 .
Django默认使用关系数据库;你应该利用他们 . 使用ManyToManyField将友谊映射到数据库关系(外键约束) . 这样做允许您将RelatedManagers用于使用智能查询集的好友列表 . 您可以使用所有可用的方法,例如
filter
或values_list
.使用
ManyToManyField
关系和属性:您可以通过以下方式访问用户的好友列表:
但请注意,这些关系是对称的:如果约瑟夫是鲍勃的朋友,那么鲍勃是约瑟夫的朋友 .
如果你在Postgres中使用Django> = 1.9,你可以利用ArrayField优势
嵌套数组字段也是可能的:
正如@ thane-brimhall所提到的,也可以直接查询元素 . 文档reference
请记住,这最终必须以关系数据库结束 . 所以使用关系确实是解决这个问题的常用方法 . 如果你绝对坚持对对象本身存储的列表,你可以把例如逗号分隔,并将其存储在一个字符串,然后再把该字符串分割成一个列表访问功能 . 这样,您将被限制为最大字符串数,并且您将失去有效的查询 .
如果你使用postgres,你可以使用这样的东西:
如果您需要更多详细信息,请参阅以下链接:https://docs.djangoproject.com/pt-br/1.9/ref/contrib/postgres/fields/
您可以使用Django Pickle Field存储几乎任何对象,这个片段:
http://www.djangosnippets.org/snippets/513/
使用一个一对多的关系(FK从朋友到父类)可以将您的应用程序更具伸缩性(你可以用平凡超出了简单的名称附加属性扩展朋友的对象) . 因此这是最好的方法
Storing a list of strings in Django model:
你可以这样称呼它: