2016-05-03 2 views
0

Ich habe zwei Modelle, sagen wir mal Buch und Autor, wie folgt:Django: Wie ändert man das gleiche Feld in anderen Einträgen mit demselben Fremdschlüssel?

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    author = models.ForeignKey('Author') 
    latest_book = models.BooleanField(default=True) 

Nun, wenn ich ein neues Buch eines Autors verknüpft erstellen, wird die „latest_book“ Feld automatisch auf True gesetzt werden, was in Ordnung ist so weit ...

Zum Beispiel, sagen wir, ich habe einen Autor mit einer Trilogie: Book1, Book2 und Book3 - Book3 ist die neueste.

Ich habe zwei Probleme: 1 - Wie das "letzte Buch" Feld von Book1 und Book2 auf falsch gesetzt, wenn Book3 gespeichert wird? 2 - Wenn Book3 gelöscht wird, wie wird das Feld "latest_book" von Book2 auf "true" gesetzt?

Auch ich habe eine Methode vorher verwendet, aber das Problem war, dass ich nicht list_filter von BookAdmin verwenden konnte, um nur die neuesten Bücher aller Autoren anzuzeigen, da ich nie gefunden habe, wie list_filter auf Methodenergebnisse ... Und ich muss diese Filterung tun, so versuche ich jetzt mit dem Modellfeld

+0

Haben Sie ** Signal ** oder ** DateTimeField ** anstelle von BooleanField versucht? – trantu

+0

Was passiert, wenn ein Autor zwei Bücher gleichzeitig veröffentlicht? – Sayse

+0

Ich bin neu in Django und habe nie ** Signal ** benutzt. Ich verwende bereits ein ** DateTimeField ** für das published_date, aber ich würde gerne ein BooleanField als Flag zusätzlich verwenden ... – Gerald

Antwort

1

Ganz einfach, speichern Sie nicht das neueste Buch, können Sie es einfach als eine Methode oder Eigenschaft des Autors, die ein tun können Abfrage, um es abzurufen

Speichern von Logik in Ihrer Datenbank ist eine schlechte Idee, es sollte nur Daten speichern.

+0

Ja, ich verwende diese Methode in meinem AuthorAdmin, und es funktioniert gut. Also in AuthorAdmin, kann ich die Liste der Autoren und die neuesten_Buch für jede von ihnen sehen. Was ich jetzt tun möchte, ist eine Flagge in der ** BookAdmin **, die angibt, ob das Buch ein latest_book ist oder nicht, und wenn ich ein Buch hinzufüge oder lösche, um dieses Flag automatisch zu verschieben. Ich möchte auch in der Lage sein, den BookAdmin zu filtern, um nur Bücher zu sehen, die als latest_book gekennzeichnet sind. Können wir die Ergebnisse der list_filter-Methode auf irgendeine Weise berechnen? Wenn ja, könnte ich es auch für den BookAdmin verwenden ... – Gerald

+0

@Gerald - Sie könnten immer noch eine (verschachtelte) Methode auf dem Buch haben - 'self.author.book_set ... == self' aber ich bin es nicht sicher, wie viel Sie tatsächlich brauchen würden – Sayse

+0

@Saryse - Sie schlagen einen logischen Test vor, aber ich bin nicht sicher zu verstehen, wie ich es verwenden sollte? Es ist immer noch das Flag "latest_book" im BookAdmin zu definieren, richtig? Wenn ja, habe ich herausgefunden, wie es geht, aber dann kann ich list_filters nicht verwenden, um nur die Bücher mit diesem Flag anzuzeigen ... Da es nicht Teil eines Tupels ist. Deshalb suchte ich nach einer Möglichkeit, die Flagge direkt als Tupel zu speichern. Ich habe ein paar Sachen über die save_related-Methode gelesen ... Glauben Sie, dass es mir erlaubt, die Felder anderer Bücher zu ändern, die denselben Fremdschlüssel teilen (den Autor identifizieren)? – Gerald

Verwandte Themen