2017-06-18 2 views
1

Ich habe diesen Fehler, wie kann ich das beheben?Django get() zurückgegeben mehr als eine

get() gab mehr als ein Ereignis zurück - es gab 2 zurück!

Können Sie mir helfen, zu verstehen, was das bedeutet, und mir vielleicht im Voraus sagen, wie Sie diesen Fehler in Zukunft vermeiden können?

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) 

ANSICHTEN

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') 

Antwort

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

get() wirft MultipleObjectsReturned, wenn mehr als ein Objekt gefunden wurde, weitere Informationen here. der Fehler ist Ursache von event_detail = Event.objects.get(pk=pk), überprüfen Sie Ihre Veranstaltung PK ist einzigartig.

0

Grundsätzlich erhält das Objekt cls mehr als einen Wert für den get-Teil von 'get_or_create()'. get() gibt nur ein einzelnes Objekt zurück, während filter ein dict (ish) zurückgibt. Setzen Sie es stattdessen in einen Versuch/ausgenommen. So werden Sie haben:

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() 

diese Weise, wenn mehrere Objekte gefunden werden, es behandelt die Ausnahme und ändert die Abfrage an einen Filter, um die mehrere Objekt queryset zu empfangen. Das Objekt Object.DoesNotExist muss nicht abgefangen werden, da das Erstellungselement ein neues Objekt erstellt, wenn kein Datensatz gefunden wird.

+0

danke, jetzt ist es nicht durch Ausnahme, aber tun Sie nichts – rumor

+0

@ rumor Ich vermute, du meinst die Ausnahme wird jetzt behandelt, groß, hast du 'sub_event.sadd (this_user)' nach dem außer setzen Block? Ihre make_sub-Methode fügt den Benutzer den Benutzer hinzu, wenn dieser gefunden wird. – shaded

+0

ja, natürlich was werde ich als nächstes tun, um das zu beheben? Pls helfen mir – rumor

Verwandte Themen