django - 扩展 Django 用户配置文件的新手,需要帮助为数据库中的每个用户创建联系人/电话号码列表

标签 django model

我对 Django 有点陌生,到目前为止只是使用简单的数据库/模型配置。但我开始遇到一些限制。我需要为个人用户添加联系人列表,该列表仅存储姓名和电话号码的集合。 但除了将整个列表存储为字符串或将反序列化的 JSON 存储在单个字符或文本字段中(恶心)之外,我看不出用我已经创建的 UserProfile 模型可以做到这一点。

例如说我必须建模:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

    #Persional Informaiton
    height                  = models.CharField(max_length=24, blank=False,null=True)
    weight                  = models.CharField(max_length=24, blank=False,null=True)
    birthday                = models.CharField(max_length=24, blank=False,null=True)

    ###THIS IS THE FIELD I NEED TO ADD!!  
    #Contacts  
    contact_list            = models.SomeKindOfField() #could contain either an array or JSON??   

    class Meta:
        managed = True
        db_table = 'user_profiles'        

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

还有其他方法可以做到这一点吗?我还考虑过为每个用户创建一个包含“姓名”和“电话”列的表,但开始怀疑这是否会成为管理的噩梦。

我对使用 models.ForeignKey(User) 做了一些研究,但从未完全掌握它的实现。

如果有任何指点,我们将不胜感激!谢谢。

最佳答案

如果您希望以标准关系数据库方式执行此操作,有几种选择。

  1. 将名称和电话号码作为属性的 Contact 模型以及外键添加到 UserProfile。这将允许您执行user_profile.contact_set.all()。或者,如果您希望多个用户能够共享某些联系人,则可以使用 ManyToMany 来代替 FK。
  2. 如果您确实希望电话号码与用户或用户个人资料记录相关联,以便用户的联系人列表是其他用户,而不仅仅是各种电话号码和姓名,则可以添加 phone_number属性到您的 UserProfile 模型。然后contact_list = models.ManyToManyField('self')。请参阅文档:https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.symmetrical

或者,如果您不想担心更多模型关系并且正在使用 postgres,则可以使用 hstore,它允许您存储字典字段。请参阅https://github.com/djangonauts/django-hstore有关其工作原理的实际文档。

关于django - 扩展 Django 用户配置文件的新手,需要帮助为数据库中的每个用户创建联系人/电话号码列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27238864/

相关文章:

python - Django断言post_save信号被调用

python - 数据在我的 django 模板中无法正确显示

django - 如何在我的应用程序中获取用户之间的关系?

c++ - 观察者设计模式问题

python - 在 Django 管理中,在初始保存时发推文?

xml - 如何访问Extjs嵌套模型(从Xml加载)?

django - 模板不存在 Django 错误

python - 有没有像 Django 的拱形单元这样的库?

python - Django/Python 中的 Celery 任务最佳实践

c# - DataContext 始终返回 null 作为外键