2017-06-18 1 views
1

J'ai cette erreur, comment puis-je résoudre ce problème? Get() renvoie plus d'un événement - il renvoie 2! Pouvez-vous m'aider à comprendre ce que cela signifie et peut-être me dire à l'avance comment éviter cette erreur à l'avenir?Django get() retourné plus d'un

MODÈLE

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) 

VUES

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

Répondre

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

get() Déclenche MultipleObjectsReturned si plus d'un objet a été trouvé plus d'info here. l'erreur est provoquée par event_detail = Event.objects.get(pk=pk), vérifiez votre événement pk est unique.

0

Fondamentalement, l'objet cls obtient plus d'une valeur sur la partie get de 'get_or_create()'. get() renvoie uniquement un seul objet alors que le filtre renvoie un dict (ish). Mettez-le en essai/sauf à la place. Ainsi, vous aurez:

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

De cette façon, si plusieurs objets se trouvent, il gère l'exception et modifie la requête d'un filtre pour recevoir les multiples queryset d'objet. Pas besoin d'attraper Object.DoesNotExist car la partie create crée un nouvel objet si aucun enregistrement n'est trouvé.

+0

merci, maintenant ce n'est pas par exeption, mais ne faites rien – rumor

+0

@rumor Je suppose que vous voulez dire que l'exception est maintenant gérée, super, avez-vous remis 'sub_event.subs.add (this_user)' après l'exception bloc? votre méthode make_sub ajoute l'utilisateur s'il est trouvé dans les sous-marins. – shaded

+0

oui, bien sûr ce que je vais faire ensuite pour résoudre ce problème? Pls m'aider – rumor