2017-06-18 7 views
1

私はこのエラーがありますが、これをどのように修正できますか?Django get()が複数返されました

get()複数のイベントが返されました - 2を返しました!

今後のこのエラーを回避する方法を教えてもらえますか?

MODEL

class Event (models.Model): 
    name = models.CharField(max_length=100) 
    date = models.DateField(default='') 
    dicript = models.CharField(max_length=50, default='Описание отсутствует') 
    category = models.ForeignKey(Category,on_delete=models.CASCADE) 
    adress = models.TextField(max_length=300) 
    user = models.ForeignKey(User,related_name="creator",null=True) 
    subs = models.ManyToManyField(User, related_name='subs',blank=True) 

    @classmethod 
    def make_sub(cls, this_user, sub_event): 
     event, created = cls.objects.get_or_create(
      user=this_user 
     ) 
     sub_event.subs.add(this_user) 

VIEWS

def cards_detail (request,pk=None): 
    # if pk: 
    event_detail = Event.objects.get(pk=pk) 
    subs = event_detail.subs.count() 

    # else: 
    #  return CardsView() 
    args = {'event_detail':event_detail,'subs':subs} 
    return render(request,'events/cards_detail.html',args) 


class CardsView (TemplateView):` 
    template_name = 'events/cards.html' 

    def get (self,request): 
     events = Event.objects.all() 
     return render(request,self.template_name,{'events':events }) 

def subs_to_event (request,pk=None): 

    event = Event.objects.filter(pk=pk) 
    Event.make_sub(request.user,event) 


    return redirect('events:cards') 

答えて

1
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned 
try: 
    instance = Instance.objects.get(name=name) 
except (ObjectDoesNotExist, MultipleObjectsReturned): 
    pass 

のget()複数のオブジェクトが見つかった場合には、より多くの情報hereMultipleObjectsReturnedを発生させます。 エラーはevent_detail = Event.objects.get(pk=pk)によって発生します。イベントpkが一意であることを確認してください。

0

基本的に、clsオブジェクトはget_or_create()のget部分で複数の値を取得しています。 get()は単一のオブジェクトのみを返し、filterはdict(ish)を返します。 代わりにtry/exceptに入れてください。だから、必要があるでしょう:

try: 
    event, created = cls.objects.get_or_create(
    user=this_user 
    ) 
except cls.MultipleObjectsReturned: 
    event = cls.objects.filter(user=this_user).order_by('id').first() 

複数のオブジェクトが見つかった場合は、この方法では、それが例外を処理し、複数のオブジェクトのクエリセットを受け取るために、フィルタにクエリを変更します。 Object.DoesNotExistをキャッチする必要はありません。レコードが見つからない場合、作成部分は新しいオブジェクトを作成します。

+0

ありがとうございました。例外はありませんが、何もしません – rumor

+0

@rumor例外が処理されたことを意味していると思いますが、例外の後に 'sub_event.subs.add(this_user)'を入れましたか?ブロック?あなたのmake_subメソッドは、サブユーザーに見つかった場合にユーザーを追加します。 – shaded

+0

はい、もちろん これを修正するために次に何をするのでしょうか?pls help me – rumor

関連する問題