这是构建模型的好方法吗?

时间:2019-07-19 19:48:53

标签: django database django-models database-design

一些信息。我希望用户能够查看他们的供稿,其中包含朋友的帖子,小组帖子等。我正在使用Django Rest Framework并将此供稿端点提供给前端。

我最初的想法是只为需要的物品制作单独的模型(表)。像UserPostGroupPostEventPost一样,但是我觉得在尝试合并数据时,它会进行大量的联接,并且必须将数据缝合在一起。

ex)

class UserPost(models.Model): # GroupPost, EventPost
    content = models.TextField(blank=True, default='')
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    # group/event = models.ForeignKey(Group/Event, on_delete=models.CASCADE)

如果我们想为其他模型添加帖子类型功能,这似乎不是一个好方法。


我的另一种方法是使用中间模型。 Post模型是基础模型,UserPostGroupPostEventPost是中间模型,它们具有要发布的OneToOne关系,而GroupPost将具有外键(OneToMany )与Group模型的关系。

ex)

class Post(models.Model):
    content = models.TextField(blank=True, default='')
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE)

class UserPost(UUID_PK, models.Model):
    post = models.OneToOneField(
        Post, null=True, blank=True, related_name='_uPost', on_delete=models.CASCADE)


class Group(models.Model):
    name = models.CharField(max_length=64)
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='_groups')
    members = models.ManyToManyField(settings.AUTH_USER_MODEL)

class GroupPost(models.Model):
    post = models.OneToOneField(
        Post, null=True, blank=True, related_name='_gPost', on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)


class Event(models.Model):
    name = models.CharField(max_length=64)
    about = models.TextField(null=True, blank=True)
    event_date = models.DateTimeField(null=True, blank=True)
    invited = models.ManyToManyField(settings.AUTH_USER_MODEL)

    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='_events')

class EventPost(models.Model):
    post = models.OneToOneField(
        Post, null=True, blank=True, related_name='_ePost', on_delete=models.CASCADE)
    event = models.ForeignKey(Event, on_delete=models.CASCADE)

这种方法还不错,但是现在确实需要额外的查询。 然后模仿用户的“提要”,我将像这样

进行过滤
users = # friends
groups = # groups of the user
events = # events of the user

posts = Post.objects.filter(Q(created_by__in=users, _gPost__isnull=True, _ePost__isnull=True) | Q(
        _gPost__group__in=groups) | Q(_ePost__event__in=events)).distinct().select_related('created_by')

# _gPost__isnull=True and _ePost__isnull=True is exclude the other types of post and only get the "normal" posts.

看起来真糟糕。

我不确定这是否是一个足够好的方法,或者是否有人建议改善此方法。

我确实研究了GenericRelationship,但不确定是否真的可以使它更好。我有一些处理GenericRelationship的模型,大部分情况下有点痛苦。

0 个答案:

没有答案