2016-03-01 91 views
0

我一直在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) 

有什麼不好的做法或壞的查詢,我做的是正在發生的呢?提前致謝。

+0

雖然'if stream'條件未註釋,'Channel'對象中的更改沒有得到保存。這是問題嗎? –

+0

是的你是對的 –

+0

'Channel.objects.get(stream = stream)'是如何工作的?沒有'stream'列是你的'Channel'模型。 –

回答

0

使用channel = stream.channel代替channel = Channel.objects.get(stream=stream)修復了此問題。

+0

這將允許執行其他行,例如channel.rating = channel.rating + int(rate),這隻有在用戶還沒有對流進行評級時纔會發生。 –

+0

一個頻道有許多流,每次用戶對一個流進行評價時,它也會對頻道進行評價,但一個流只能評分一次。用戶可以評價頻道的許多流。 –

+0

如果用戶要求'stream'已經被用戶評分,我們是否應該改變'channel' rate(跳過流中的改變)? –