2017-04-01 117 views
0

我有一个相当简单的用户模型完美工作。 为了减少代码冗余,我尝试将字段存储在胜利中,这是因为您可以轻松猜到。Django模型 - 如何在字典中存储字段

例子:

def get_social_token(self,social_net=""): 
    return self.social_dict[social_net]["token"] 

如果我没有做这样的结构,我必须做一些 “的if/then ... elif的......别人”。 当然,当我决定向我的应用程序添加新的社交网络时,我需要修改我的代码。

我已经尝试了两种不同的方法,他们都给予我同样的结果:

  • 没有错误
  • 没有字段实际上在DB检测和创建

我会喜欢提及如果我使用“传统方式”来实现此行为,例如:

  • twitter_socia l_token = EncryptedCharField(max_length = 500,default ='',blank = True,null = True)

它完美的工作,所以它来自于使用字典。

任何想法来解决这个问题? Btw。我宁愿避免使用新模型和外键...只有一对一的关联,我宁愿不必执行任何“加入”或在另一个表中选择...

贝娄,你会找到两次尝试我做不工作(我不知道为什么):

第一次尝试:

social_fields = { 
    'twitter' : { 
     'token' : EncryptedCharField(max_length=500, default='', blank=True, null=True), 
     'secret' : EncryptedCharField(max_length=500, default='', blank=True, null=True) 
    }, 
    'facebook' : { 
     'token' : EncryptedCharField(max_length=500, default='', blank=True, null=True), 
     'secret' : EncryptedCharField(max_length=500, default='', blank=True, null=True) 
    }, 
    'gplus' : { 
     'token' : EncryptedCharField(max_length=500, default='', blank=True, null=True), 
     'secret' : EncryptedCharField(max_length=500, default='', blank=True, null=True) 
    }, 
    'linkedin' : { 
     'token' : EncryptedCharField(max_length=500, default='', blank=True, null=True), 
     'secret' : EncryptedCharField(max_length=500, default='', blank=True, null=True) 
    }, 
} 

第二次尝试:

social_tokens = dict() 

social_tokens["twitter"] = dict() 
social_tokens["facebook"] = dict() 
social_tokens["linkedin"] = dict() 
social_tokens["gplus"] = dict() 

social_tokens["twitter"]["token"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
social_tokens["twitter"]["secret"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

social_tokens["facebook"]["token"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
social_tokens["facebook"]["secret"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

social_tokens["linkedin"]["token"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
social_tokens["linkedin"]["secret"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

social_tokens["gplus"]["token"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
social_tokens["gplus"]["secret"] = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

感谢您的帮助亲爱的朋友们,

乔纳森

+0

** **请不要发布的代码截图;张贴实际的代码。 –

+0

对不起,我修正了我的消息。 –

回答

2

据我所知,没有使用加入你有3个不同的方式:

的Django -picklefield提供了一个腌制对象 字段的实现。这些字段可以包含任何可拣货对象。

从他们的文档,使用;只是在你的模型中定义一个字段:

>>> from picklefield.fields import PickledObjectField 
... class SomeObject(models.Model): 
...  args = PickledObjectField() 

,并分配任何你喜欢的(只要它是picklable)到外地:

>>> obj = SomeObject() 
>>> obj.args = ['fancy', {'objects': 'inside'}] 
>>> obj.save() 

的Django -jsonfield是一个可重用的Django字段,允许您在模型中存储 已验证的JSON。 它静静地照顾序列化。要使用,只需将字段 添加到您的某个模型。

使用,只需安装包,然后使用字段:

from django.db import models 
import jsonfield 

class MyModel(models.Model): 
    the_json = jsonfield.JSONField() 

字段存储的映射字符串到字符串。 Python数据 使用的类型是字典。

from django.contrib.postgres.fields import HStoreField 
from django.db import models 

class Dog(models.Model): 
    name = models.CharField(max_length=200) 
    data = HStoreField() 

Dog.objects.create(name='Rufus', data={'breed': 'labrador'}) 
1

它会definetely工作,但是当你看到我使用加密字段,以保持我的安全用户的令牌和secret_tokens。

我希望这不是一件坏事或某种反模式。 随意分享一个更好的方式来做到这一点。

我刚刚发现了一种解决方法,它实际上以我想要的方式工作,即使从我的角度来看它不是超高效的。

这里是你访问数据:

from application.models import * 
tmp_user = CustomUser.objects.get(username="random_username") 

print (getattr(tmp_user, tmp_user.social_fields["twitter"]["token"])) 
>>> e72e16c7e42f292c6912e7710c838347ae178b4a ### This token is a fake ! 

这里是如何成功地做到这一点:

twitter_token   = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
twitter_token_secret = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

facebook_token   = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
facebook_token_secret = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

gplus_token   = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
gplus_token_secret  = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

linkedin_token   = EncryptedCharField(max_length=500, default='', blank=True, null=True) 
linkedin_token_secret = EncryptedCharField(max_length=500, default='', blank=True, null=True) 

social_fields = { 
    'twitter' : { 
     'token' : "twitter_token", 
     'secret' : "twitter_token_secret" 
    }, 
    'facebook' : { 
     'token' : "facebook_token", 
     'secret' : "facebook_token_secret" 
    }, 
    'gplus' : { 
     'token' : "gplus_token", 
     'secret' : "gplus_token_secret" 
    }, 
    'linkedin' : { 
     'token' : "linkedin_token", 
     'secret' : "linkedin_token_secret" 
    }, 
} 
相关问题