Fehler bei der Verwendung eines Basisklassenfelds in der Unterklasse unique_together meta-Option

7

Verwenden Sie den folgenden Code:

%Vor%

Der Versuch, syndb zu synchronisieren, gibt mir diesen Fehler:

%Vor%

Jede Hilfe ist willkommen,

Danke,

Eric

    
Eric Acevedo 05.10.2010, 18:51
quelle

4 Antworten

12

Dies ist beabsichtigt. Lesen der Dokumentation für die Option unique_together lautet:

>
  

Es wird im Django-Admin verwendet und wird auf Datenbankebene erzwungen .

Wenn Sie sich die Tabelle ansehen, die eine Unterklasse erstellt, sehen Sie, dass sie nicht die Felder enthält, die ihr Elternteil hat. Stattdessen erhält es einen weichen Fremdschlüssel für die übergeordnete Tabelle mit dem Feldnamen [field]_ptr_id , wobei [field] der Name der Tabelle ist, die Sie erben, wobei der Name der Anwendung ausgeschlossen wird. Ihre Divisionstabelle hat also einen primären Fremdschlüssel namens organization_ptr_id .

Jetzt, da unique_together auf der Datenbankebene mit der Einschränkung UNIQUE erzwungen wird, gibt es keine Möglichkeit, dass ich weiß, dass die Datenbank dies tatsächlich auf ein Feld anwendet, das nicht in der Tabelle ist.

Ihre beste Wette besteht wahrscheinlich darin, Validatoren auf Ihrer Geschäftslogikebene zu verwenden oder Denken Sie an Ihr Datenbankschema, um die Einschränkung zu unterstützen.

Bearbeiten: Wie Manoj schon sagte, können Sie auch Modellvalidatoren wie validate_unique .

    
Pewpewarrows 05.10.2010, 19:24
quelle
4

[Model] Validatoren würden für Sie arbeiten. Am einfachsten wäre es jedoch zu verwenden:

%Vor%

Hinweis: Wie bei Ihrem aktuellen Code könnten Sie keine Unterteilungen von Unterteilungen haben.

    
Jameson Quinn 22.02.2011 10:48
quelle
2

Dies gilt nicht streng für die Frage, ist aber sehr eng verwandt; unique_together funktioniert, wenn die Basisklasse abstrakt ist. Sie können abstrakte Modellklassen wie folgt markieren:

%Vor%

Dies verhindert, dass Django eine Tabelle für die Klasse erstellt, und ihre Felder werden direkt in Unterklassen eingeschlossen. In diesem Fall ist unique_together möglich, weil sich alle Felder in derselben Tabelle befinden.

Ссылка

    
Richard 17.01.2014 13:38
quelle
1

Dies ist eine Lösung, die ich kürzlich in Django 1.6 verwendet habe (danke an Manoj Govindan für die Idee):

%Vor%     
Joseph Kriefall 16.01.2014 23:59
quelle

Tags und Links