我一直在Django工作了一段時間,現在我遇到了這個奇怪的問題。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.save()之後的對象沒有保存,只有Stream對象發生了奇怪的變化。
所以做一些調試完畢後,我決定發表評論這個如果我使用,因此用戶不能率流不止一次:
##if stream not in request.user.channel.rated_streams.all():
而且現在channel.save()的工作!壞事是我不能讓用戶不止一次地評價一個流。
繼承人的模型的簡化版本:
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)
有什麼不好的做法或壞的查詢,我做的是正在發生的呢?提前致謝。
雖然'if stream'條件未註釋,'Channel'對象中的更改沒有得到保存。這是問題嗎? –
是的你是對的 –
'Channel.objects.get(stream = stream)'是如何工作的?沒有'stream'列是你的'Channel'模型。 –