我有Article
表
class Article(models.Model):
"""
Model to keep articles
"""
ext_id = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=255, unique=True, db_index=True)
content = models.TextField()
summary = models.TextField()
img_url = models.URLField(max_length=200)
author = models.CharField(max_length=50, blank=True, null=True)
sport = models.ForeignKey('Sport')
posted_on= models.DateTimeField()
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __unicode__(self):
return "%s by %s" % (self.title, self.author)
我存储用户喜欢的文章的表格:
class LikedArticle(models.Model):
"""
Articles that a user wants to read
"""
ext_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
article = models.ForeignKey(Article)
profile = models.ForeignKey(Profile)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
并且不喜欢:
class UnlikedLikedArticle(models.Model):
"""
Articles that a user does not want to read
"""
ext_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
article = models.ForeignKey(Article)
profile = models.ForeignKey(Profile)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
现在,这两个表都喜欢和不喜欢,在结构上是相同的。
我觉得最好像这样存储它而不是存储一个名为is_liked
的bool字段,因为我确切地知道我存储了什么数据。因此,当我知道我只对LikedArticle
感兴趣时,我不必查询大量文章。
这是正确的方法吗?我只是感到困惑,因为在结构上它们看起来一样,并且对这种设计感觉不对。
答案 0 :(得分:1)
我推荐的最佳方法是使用一个表并添加is_liked
字段。 (并为此字段添加索引,以便获得高性能查询)
但如果您仍想使用2表的方法,那么您需要修复您的设计。
使用一个包含所有字段的抽象模型,Like和不同的表继承自抽象模型
class ActionOnArticle(Model):
your fields here..
class Meta:
abstract = True
class LikedArticle(ActionOnArticle):
class UnLikedArticle(ActionOnArticle):
答案 1 :(得分:1)
我认为is_liked不是一个好的选择,如果你想保存每个配置文件的其他信息,比如:谁喜欢什么,什么时候等等。如果你想丢失这些信息,那么我的建议是使用多对多关系,文章模型将是这样的:
class Article(models.Model):
"""
Model to keep articles
"""
ext_id = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=255, unique=True, db_index=True)
content = models.TextField()
summary = models.TextField()
img_url = models.URLField(max_length=200)
author = models.CharField(max_length=50, blank=True, null=True)
sport = models.ForeignKey('Sport')
posted_on= models.DateTimeField()
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
likes = models.ManyToManyField(Profile)
unlikes = models.ManyToManyField(Profile)
def __unicode__(self):
return "%s by %s" % (self.title, self.author)
https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/
如果您想保存我回复开头提到的信息,我认为@Eyal答案很好
答案 2 :(得分:0)
我使用" is_liked" BooleanField并对其进行过滤以获取喜欢或不喜欢的文章。对BooleanField进行过滤(在字段选项上添加db_index = True)对于任何体面的数据库来说都非常快,因此即使它们很大,您也不太可能使用单独的表获得显着的性能提升。