嘿所以我正在制作一个配色方案发布网站,人们可以注册并发布他们提出的配色方案。到目前为止,一切都很好,我唯一要做的就是添加一个“Like Post”功能。我想知道实现这个的最佳方法是什么。
我有两个关于如何做到这一点的想法,第一个是为ColorSet(帖子)和用户模型添加一个额外的字段(对于用户模型,我将设置一个具有OneToOne关系的新模型来添加在用户模型上),它会记录每个帖子的用户,以及每个用户喜欢跟踪所有内容的帖子。
所以这看起来像这样:
from django.db import models
from django.core.urlresolvers import reverse
from django.conf import settings
from django.contrib.auth import get_user_model
User = get_user_model()
# Create your models here.
class ColorSet(models.Model):
user = models.ForeignKey(User,related_name='colorset')
published_date = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=50,blank=False)
color_one = models.CharField(max_length=6,blank=False,default='cccccc')
color_two = models.CharField(max_length=6,blank=False,default='ffffff')
color_three = models.CharField(max_length=6,blank=False,default='e5e5e5')
color_four = models.CharField(max_length=6,blank=False,default='f0f0f0')
color_five = models.CharField(max_length=6,blank=False,default='bababa')
liked_by = models.IntegerField(blank=True)
def publish(self):
self.save()
def get_absolute_url(self):
return reverse('index')
def __str__(self):
return self.name
用户模型:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class UserStats(models.Model):
user = models.OneToOneField(User)
liked_sets = models.IntegerField(blank=True)
def __str__(self):
return self.user.username
在第一个选项中,我将使新模型字段(likes_sets和likes_by)等于包含每个用户喜欢的所有颜色集的确定以及分别喜欢每个帖子的所有用户的列表。
我正在考虑的另一种方法是创建一个全新的模型,跟踪每个颜色集的帖子(不完全确定这个模型看起来如何)。
除了哪个更容易之外,我想知道从技术角度来看哪个更有意义?这两个选项中的一个会占用更多空间还是会产生更重的服务器负载?
感谢您的帮助。
答案 0 :(得分:1)
据我了解你的问题,它可以分为两部分。
维护模型ColorSet上的喜欢总数。
跟踪所有喜欢ColorSet单个实例的用户。
现在,如果我能正确理解你的问题(如果我错了,请纠正我),当你说:
新模型字段(likes_sets和likes_by)等于包含每个用户喜欢的所有颜色集的确定以及分别喜欢每个帖子的所有用户的列表。 < / p>
您打算在数据库中创建一个字段,该字段只存储所有喜欢ColorSet模型实例的人的 pks 列表。即使你不打算这样做,但仍然存在IntegerField
来存储这些信息(在我的拙见中)有些错误。
现在为什么你不想这样做?这是因为关系数据库是为了识别信息元组之间的关系,并通过创建关系来增强处理。这就是我们使用OneToOneField
和ForeignKey
等关系的原因。它们使处理速度更快。如果我们只是将pk值存储在一个字段中,那么在我们的数据库中进一步搜索它们以检索信息,这将是非常慢的东西。
现在我想你要找的是ManyToManyField。
在您的问题中,您只需将ManyToManyField映射到用户模型。
看起来像是:
class ColorSet(models.Model):
user = models.ForeignKey(User,related_name='colorset')
published_date = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=50,blank=False)
color_one = models.CharField(max_length=6,blank=False,default='cccccc')
color_two = models.CharField(max_length=6,blank=False,default='ffffff')
color_three = models.CharField(max_length=6,blank=False,default='e5e5e5')
color_four = models.CharField(max_length=6,blank=False,default='f0f0f0')
color_five = models.CharField(max_length=6,blank=False,default='bababa')
liked_by = models.IntegerField(blank=True)
#add a simple ManyToManyField which will hold all the users who liked this colorset
likers = models.ManyToManyField(User , related_name = 'liked_colorsets')
def publish(self):
self.save()
def get_absolute_url(self):
return reverse('index')
def __str__(self):
return self.name
并将UserStats
模型移至
现在使用以下代码大纲结构来访问数据库中的信息。
1)获取用户喜欢的ColorSet
:
#obtain any user model object; for example: user_object = User.objects.get(...)
user_object.liked_colorsets.all()
#a queryset with all the liked colorsets is returned.
2)获取喜欢ColorSet的User
:
#obtain any colorset model object; for example: colorset_object = ColorSet.objects.get(...)
colorset_object.likers.all()
#a queryset with all the Users who liked this colorset is returned.
我想在此处添加 还有一件事。在用户喜欢ColorSet之后,您显然希望将此用户添加到ColorSet模型中的likers
字段(并增加likes_by字段;我假设您将管理该字段)。要在likers字段中添加用户:
#obtain any colorset model object; for example: colorset_object = ColorSet.objects.get(...)
#obtain the user model object of the user who liked this colorset in user_object
#and do
colorset_object.likers.add(user_object)
详细了解如何在ManyToManyField
here in docs.
希望这会有所帮助。感谢。