2016-10-09 6 views
1

Ich implementiere eine eigenständige 'like'-Klasse (nicht nur als Teil der Question-Klasse), so dass ich in der Lage sein werde, Benachrichtigungsklasse später einschließlich neuer Likes, Folges und andere soziale Sachen zu erstellen.OneToOne Beziehungsproblem

class Question(models.Model): 
    like = models.OneToOneField('Like',related_name='like_QUESTION',null=True, blank=True) 

class Like(models.Model): 
    what_post_is_liked = models.OneToOneField('Question', related_name='what_post_is_liked_LIKE') 
    who_liked = models.OneToOneField('UserProfile', related_name='who_liked_LIKE') 
    whom = models.OneToOneField('UserProfile', related_name='whom_LIKE') 

Wie erhalte ich Eigenschaften (‚what_post_is_liked‘) die Klasse wie durch ‚wie‘ Eigentum von Question Klasse? Laut der Dokumentation zu OneToOne-Beziehungen sollte ich einfach Eigenschaften von Like-Klasse schreiben direkt nach 'like' einfach so e.like.who_liked?

questions = Question.objects.filter(whom=request.user.profile) 
for e in questions: 
      print(e.like) 

Obwohl ‚Like‘ Objekt existiert, ‚e.like‘ gibt keine, was bedeutet, dass ‚wie‘ nicht automatisch erbt ‚Like‘ neu erstellte Objekt?

like = Like(whom=a,who_liked=b,what_post_is_liked=c) 
like.save() 

Ich habe in einer Gesamtmasse. Könnte jemand bitte erklären, wie es eigentlich funktioniert? Wie kann ich automatisch kopieren/vererben und "Gefällt mir" -Eigenschaften über die Klasse "Frage" erhalten?

+0

@ e4c5 ist es bearbeitet –

Antwort

0

OneToOneField ist wahrscheinlich hier nicht der richtige. Mit einer Eins-zu-eins-Beziehung kann jeder Question höchstens einen Like haben, also was Sie suchen, ist ein ForeignKey und das ForeignKey sollte in Ihrem Like-Modell sein. So haben wir

class Question(models.Model): 
    marks = models.IntegerField() # whatever question related field 
    # there's not like here. 

class Like(models.Model): 
    what_post_is_liked = models.ForeignKey('Question', related_name='what_post_is_liked_LIKE') 
    who_liked = models.OneToOneField('UserProfile', related_name='who_liked_LIKE') 
    whom = models.OneToOneField('UserProfile', related_name='whom_LIKE') 

Dann können Sie

questions = Question.objects.filter(like__whom=request.user.profile) 

tun Wenn Sie Ihr ähnliches Objekt wollen viele verschiedene Arten von Objekten verknüpfbar sein, andere als nur Fragen, erhalten Sie eine GenericForeignKey verwenden müssen, die ist viel mächtiger (und ein wenig komplizierter)

+0

ok, habe ich die Fremdschlüssel Sache, und wie mit dem Abrufen verwandte verwandte Objektinformationen aus Frageobjekt zu behandeln? –

+1

das ist eine andere Frage, aber die Antwort ist question.like_set.all() – e4c5