我在Django上工作了一段时间,现在遇到了一个奇怪的问题。你知道吗
我在一个流媒体网站上添加了一个分级功能,为此我编写了一个通过url调用的视图:
url(r'^channel/rate/(?P<stream_id>[\d]*)/(?P<rate>[\d]*)/?$', 'eros.streaming.views.view_rate_channel',
name='view_rate_channel'),
def view_rate_channel(request,stream_id,rate):
if(stream_id and rate and request.user.is_authenticated()):
stream= Stream.objects.get(id=stream_id)
if stream not in request.user.channel.rated_streams.all():
if stream.channel.user != request.user:
channel=Channel.objects.get(stream=stream)
channel.rating= channel.rating+int(rate)
print("channel rating: "+str(channel.rating))
#this prints fine in any case
channel.n_voters = channel.n_voters +1
channel.save()
stream.rating= stream.rating+int(rate)
stream.n_voters= stream.n_voters+1
stream.save()
request.user.channel.rated_streams.add(stream)
request.user.channel.save()
return HttpResponseRedirect('/channel/'+str(stream.channel.id)+'/')
return HttpResponseRedirect('/channel/'+str(stream.channel.id)+'/')
当我检查数据库时,我对Channel对象所做的更改频道.保存()没有保存,只有流对象上的更改,我觉得很奇怪。你知道吗
因此,在进行了一些调试之后,我决定对这个if进行注释,我使用它以便用户不能对流进行多次评级:
##if stream not in request.user.channel.rated_streams.all():
而现在频道.保存()正在工作!,缺点是我不能让用户对一个流进行多次评级。你知道吗
以下是模型的简化版本:
class Channel(models.Model):
user = models.OneToOneField(User)
rating = models.IntegerField(default=0)
n_voters = models.IntegerField(default=0)
rated_streams = models.ManyToManyField('Stream', related_name="rated_streams")
description = models.TextField(default="")
class Stream(models.Model):
## I think that maybe this relation is what is causing me trouble (?):
channel = models.ForeignKey(Channel)
rating = models.IntegerField(default=0)
n_voters = models.IntegerField(default=0)
有没有什么不好的做法或不好的疑问,我正在做的,使这一点发生?提前多谢了。你知道吗
用
channel = stream.channel
代替channel = Channel.objects.get(stream=stream)
修复了这个问题。你知道吗相关问题 更多 >
编程相关推荐