4

我正在尝试在 Django 中做一堵墙,我已经做出了一个重要的设计决定。

我有以下课程:

WallPost、用户配置文件、组、事件

问题是我有用户个人资料、事件和组,它们都有可以发布的墙。因此,我无法与发布到正在发布的模型的用户建立外键关系,因为可以发布多个模型(除非我使用通用键,但我觉得所有墙贴都必须有一些外壳像墙壁物体)。

然后我想有一个中间类型的对象,比如墙,墙贴将外键到墙上,然后用户组和事件将外键到墙上。这对我来说也似乎效率低下,因为墙壁没有任何东西可以存储,而更像是一个封闭对象。

在 django 中使用 ForeignKeys 和 ManyToManyFields 和 GenericForeignKeys 时的最佳做法是什么?就像你如何判断这段关系应该走向何方?

感谢所有的投入。

4

1 回答 1

2
class WallPost(models.Model):
    text = models.TextField()

class UserProfile(models.Model):
    name = models.CharField(max_length=128)
    wall_posts = models.ManyToManyField(WallPost, through='UserWall')

class UserWall(models.Model):
    profile = models.ForeignKey(UserProfile)
    post = models.ForeignKey(WallPost)

#same for groups
class Group(models.Model):
    name = models.CharField(max_length=128)
    wall_posts = models.ManyToManyField(WallPost, through='GroupWall')

class GroupWall(models.Model):
    group = models.ForeignKey(Group)
    post = models.ForeignKey(WallPost)

UserWall.objects.filter(profile_id=profile.id).select_related('post')
GroupWall.objects.filter(group_id=group.id).select_related('post')

#or
group = Group.objects.get(id=1).select_related('wall_posts')
posts = group.wall_posts.all()

或者

class Wall(models.Model):
    TYPE = (
        (0, 'User'),
        (1, 'Group'),
        (2, 'Event'),
    )

    source = IntegerField() #id of user/group/event
    source_type = SmallIntegerField(choices=TYPE)


class WallPost(models.Model):
    text = models.TextField()
    wall = models.ForeignKey(Wall)

我会这样做的。

于 2012-08-07T17:43:33.067 回答