2014-12-01 26 views
0

为每个用户创建一个联系人/电话号码列表我是一个有点新的Django和至今刚刚与简单的数据库/模型配置工作。但我开始遇到一些限制。我需要为个人用户添加联系人列表,只需存储一组姓名和电话号码即可。 但我没有办法做到这一点,我已经创建的UserProfile模型,除了将整个列表作为字符串或反序列化的JSON存储在单个字符或文本字段(yuck)之外。新延长Django的用户配置文件,需要帮助数据库

例如说我有模式:

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(用户)一个小小的研究,但从未完全掌握它的实施。

任何指针这里将不胜感激!谢谢。

回答

1

如果您正在寻找这样做在一个标准的关系型数据库的方式,有几个选项。

  1. 添加Contact模型姓名和电话号码属性和一个ForeignKey到UserProfile。这可以让你做user_profile.contact_set.all()。或者,如果您希望多个用户能够共享某些联系人,则可以使用ManyToMany而不是FK。
  2. 如果你真的想要的电话号码与用户或用户配置文件记录进行关联,使用户的联系人列表是其他用户,而不是仅仅什锦电话号码和姓名,你可以在phone_number属性添加到您的用户配置模式。然后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

+0

@ Gman-O,我没有代表评论你的答案,womp。但很高兴你能工作! Re:最佳实践/我的观点,'managed'和'db_table'属性通常保持默认。用Django 1。5+你不再需要UserProfile模型,你可以[创建一个自定义的'User'模型](https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substitution-a-custom-user代替)。但是,嘿,如果它全部正常工作...... – baylee 2014-12-02 09:11:09

0

非常感谢baylee对这个伟大的解释。我能够启动并运行一些东西。我不完全确定这是否会被认为是最佳做法?而且我也不确定这个方案是否存在安全漏洞或瓶颈,但它似乎在我的应用程序中运行良好。

models.py

from django.db import models 
from django.contrib.auth.models import User 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    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) 

    class Meta: 
     managed = True 
     db_table = 'user_profiles'   
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) 

class UserContacts(models.Model): 
    user     = models.ForeignKey(User) 
    name     = models.CharField(max_length=24, blank=False,null=True) 
    phone     = models.CharField(max_length=24, blank=False,null=True) 

    class Meta: 
     managed = True 
     db_table = 'user_contacts' 

views.py

def add_contact(request): 
    if request.user.is_authenticated(): 
     update_success = False 
     form = addContact(request.POST or None) 
     if request.method == 'POST': 
      if form.is_valid(): 
       data = form.cleaned_data 
       contact = form.save(commit=False) 
       contact.user = request.user 
       contact.save() 
       form = addContact() #return blank form so user can continue adding to db 
       update_success = True 

     return render_to_response('contact_form.html', 
            {'update_success':update_success, 
            'form':form, 
            }, 
            context_instance=RequestContext(request), 
           ) 
    else: 
     return redirect('/accounts/login/') 

forms.py

from django import forms 
#Using Crispy forms helper object and bootstrap styling 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit, Layout, ButtonHolder 
from crispy_forms.bootstrap import TabHolder, Tab 
#Using Models from "project.account" app 
from accounts.models import UserContacts 

class addContact(forms.ModelForm):  
    def __init__(self, *args, **kwargs): 
     super(addContact, self).__init__(*args, **kwargs)  
     self.helper = FormHelper() 
     self.helper.form_tag = False 
     self.helper.layout = Layout(
      TabHolder(
       Tab(
        'Basic Information', 
         'name', 
         'phone', 
        ), 
      ), 
      ButtonHolder(
         Submit('Save', 'Proceed', css_class='btn btn-lg btn-default') 
         ), 
     ) 
    class Meta: 
     model = UserContacts 
     fields = ( 
        'name', 
        'phone', 
       ) 

谢谢大家!