从models.User继承:当用户数据保存在数据库的2个表中时,如何逃避这种情况?

时间:2011-06-09 17:10:07

标签: python django postgresql

情况是:我们需要一个存储用户档案数据的模型类(他的职业,国家,地区,城市等)。

根据官方Django文档,我们应该做类似下一步的事情:

...
class MyUser( models.User ):
  profession = models.CharField( max_length = 64 )
  # other fields...
...

问题是:由于数据库中的 django-admin.py syncdb 命令,有2个表。因此,如果我们想按行业找到用户,那么我们的搜索就不那么有效了!我们只能使用一个表进行搜索,但我们必须使用两个进行搜索!

syncdb 之后只在数据库中创建一个表时,我知道一个不是非常 clean 的解决方案:而不是继承自模型。用户类我们可以在下一步扩展现有的用户

# utils.py
class Utils:

    class ClassContributor: 

        @staticmethod
        def contribute_fields( object_class, *fields ):
            for val in fields:                      
                field_name = val[ 0 ]
                field = val[ 1 ]
                field.contribute_to_class( object_class, field_name )

# models py
user_contributor = Utils.ClassContributor.contribute_fields(    
    User, 
    ( 'profession', models.CharField( max_lenght = 64 ) ),
)

结果有一个表格,但我们在 Django admin

中看不到专业字段

是否有人知道 2-tables 问题的另一种解决方案?谢谢。

1 个答案:

答案 0 :(得分:1)

根据建议in the docs,您可以使用“用户个人资料”来存储有关用户的其他信息:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)

    profession = models.CharField( max_length = 64 )
    # other fields...

您可以user.get_profile().profession访问它。你仍然得到两张桌子,但这是推荐的django方式。如果您只搜索配置文件的属性,则只搜索一个表。

除此之外:这个搜索在您的特殊用例中真的很贵吗?你有资料吗?对我来说,使用两个表的方法总是没问题。