2016-05-11 4 views
0

Ich habe 3 Modelle: Benutzer, Wahl, Karte. Jeder Benutzer wird den gleichen Satz von 10 Karten betrachten und entscheidet, ob jeder wichtig ist oder nicht.'.....' Objekt ist nicht iterierbar in Django

Hier sind, wie ich die Klassen und ihre Beziehung definieren

In models.py:

class Choice(models.Model): 
    user = models.ForeignKey(User) 
    card = models.ManyToManyField(Card) 
    is_important = models.NullBooleanField() 

class Card(models.Model): 
    card_number = models.IntegerField(primary_key=True) 
    content = models.TextField(null=False) 

In views.py

(Ich versuche, die Wahl für die Karte aus dem sparen Benutzer.)

def listings(request): 
    user = request.user 
    choice = Choice.objects.create(user=user, is_important = True) 
    choice.card= Card.objects.get(1) 

jedoch habe ich diesen Fehler

'Card' object is not iterable 

Könnten Sie mir bitte zeigen, wo der Fehler liegt?

Vielen Dank!

+0

'Karten.Objekt s.get (1) 'ist keine gültige Django-Syntax. Was versuchst du da zu machen? –

+0

Wollten Sie stattdessen 'choice.card = Card.objects.get (card_number = your_number)' '' verwenden? –

+0

Auch wenn es richtig geschrieben wurde, würde es ein Autoobjekt zurückgeben, nicht viele. – fips

Antwort

1

In Ihrer Funktion hinzufügen:

def listings(request): 
    user = request.user 
    choice = Choice.objects.create(user=user, is_important = True) 
    choice.card= Card.objects.get(1) 

Die folgende Zeile das Kartenobjekt zu holen versucht. Wir müssen jedoch angeben, welche Karte abgerufen werden soll. Wenn eine ID verwenden, fragen Sie es als:

choice.card= Card.objects.get(pk=1) 

oder auch Liste von IDs:

choice.card = Card.objects.filter(pk__in=[12,22]) 

Bei der Verwendung von card_number Feld:

choice.card= Card.objects.get(card_number=1) 

oder auch von card_numbers mit Liste:

choice.card = Card.objects.filter(card_number__in=[12,22]) 
2

Zuerst sieht es aus wie Sie pk= in Ihrem .get() ersten Argumente vergessen: Card.objects.get(pk=1)

Zweitens Choice.cards ist ein ManyToManyField, die eine Liste von Elementen und nicht einen insbesondere erwartet. Sie sollten es gesetzt durch:

choice.card.set(Card.objects.filter(pk=1)) 

Sie, dass die direkte assignement beachten Sie mit =will be deprecated from Django 1.10 and deleted in Django 2.0

.filter() eine QuerySet zurückkehren (die iterable ist). Ich glaube, Sie wollten ein ForeignKey anstelle eines M2M-Felds, in diesem Fall würde Ihr Code funktionieren (mit dem zusätzlichen pk=).

3

Sie können Objekt gegen viele zu viele Felder wie diese

card = Card.objects.create(card_number=any_number, content='abc') 
choice.card.add(card) 
Verwandte Themen