一些信息。我希望用户能够查看他们的供稿,其中包含朋友的帖子,小组帖子等。我正在使用Django Rest Framework并将此供稿端点提供给前端。
我最初的想法是只为需要的物品制作单独的模型(表)。像UserPost
,GroupPost
,EventPost
一样,但是我觉得在尝试合并数据时,它会进行大量的联接,并且必须将数据缝合在一起。
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
模型是基础模型,UserPost
,GroupPost
,EventPost
是中间模型,它们具有要发布的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的模型,大部分情况下有点痛苦。