您如何看待我的Django模型结构?

时间:2017-03-26 17:50:35

标签: django

  1. 我的项目有两种或更多种不同的模型作为帖子
  2. 我想为各种帖子模型添加书签
  3. 我需要信息中心或时间轴,以显示任何帖子
  4. 的书签帖子

    所以我想到了2个计划。

    第一个计划:

    在每个帖子上制作不同的书签模型

    喜欢:

    class UserProfile(models.Model):
        user = AutoOneToOneField(User, primary_key=True)#its_from_django-annoying
    
    class Post1(models.Model):
        text1 = models.TextField(max_length=110)
    
    class Post2(models.Model):
        text2 = models.TextField(max_length=120)
    
    class bookmarkForPost1(models.Model):
        who_user = models.ForeignKey(UserProfile)
        what_bookmarked = models.ForeignKey(Post1)
    
    class bookmarkForPost2(models.Model):
        who_user = models.ForeignKey(UserProfile)
        what_bookmarked = models.ForeignKey(Post2)
    

    在views.py

    中为仪表板执行某些操作

    第二个计划:

    制作PostProfile模型并将其加入书签

    喜欢:

    class UserProfile(models.Model):
        user = AutoOneToOneField(User, primary_key=True)
    
    class PostProfile(models.Model):
        description = models.TextField(max_length=100)
        #Do something to connect Post1 or Post2
    
    class Post1(models.Model):
        text1 = models.TextField(max_length=110)
        #Do something to connect PostProfile
    
    class Post2(models.Model):
        text2 = models.TextField(max_length=120)
        #Do something to connect PostProfile
    
    class bookmarkForPosts(models.Model):
        who_user = models.ForeignKey(UserProfile)
        what_bookmarked = models.ForeignKey(PostProfile)
    

    第二个计划似乎很简单,对我的眼睛有好处。

    第二个计划,我不知道我把OneToOneField放在哪里。在PostProfile或Post1(+ Post2)?另外,我无法理解如何在创建Post1或Post2之后自动创建PostProfile。 但是第二个计划很擅长在views.py

    中没有必要做某事

    我问的是:

    1. 第一个计划和第二个计划之间是否存在严重的性能差异?如果是,那有什么更好的?
    2. 你能给我一些建议来完成第二个计划吗?

1 个答案:

答案 0 :(得分:2)

这个怎么样:定义一种帖子,以便将来可以有更多类型的帖子,以及一个UserBookmark,这样一个用户可以拥有他想要的多个书签:

class UserProfile(models.Model):
    # its a good practice from django
    user = OneToOneField(User, primary_key=True)

class Post(models.Model):
    P_TYPE_1 = 1
    P_TYPE_2 = 2
    TAB_P_TYPE = {
        P_TYPE_1: _("Type 1"),
        P_TYPE_2: _("Type 2"),
    }
    post_type = models.IntegerField(
        choices=[(a, b) for a, b in list(TAB_P_TYPE.items())],
        default=P_TYPE_1)
    text = models.TextField(max_length=110)

class UserPostBookmark(models.Model):
    user = models.ForeignKey(UserProfile)
    post = models.ForeignKey(Post)