2017-08-31 1 views
0

Ich habe folgende ModelleManyToMany Filter nicht Django arbeiten

class A(models.Model) 
    a_id = models.IntegerField(primary_key=True) 
    created_by_id = models.ManyToManyField(User,db_column="user_id", related_name="created_by_id") 
    last_updated_by = models.ManyToManyField(User, db_column="user_id", related_name="last_updated_by",) 
    resolved_by_id = models.ManyToManyField(User, db_column="user_id", related_name='resolved_by_id') 

class B(models.Model): 
    .... 

class C(models.Model): 
    .... 

class User(models.Model): 
    user_id = models.IntegerField(primary_key=True) 
    user_name = models.CharField(max_lenght=30) 

    field_1 = models.ForeignKey(B) 
    field_2 = models.ForeignKey(C) 

, wenn ich die Serialisierung auf der class A beantrage ich die folgende Fehlermeldung in SQL-Tabelle nicht gefunden zu werden, ich bin mit OracleDB

ORA-00942: table or view does not exist 

('SELECT "USER"."USER_ID", "USER"."USER_NAME" FROM "USER" INNER ' 
'JOIN "A_CREATED_BY_ID" ON ("USER"."USER_ID" = ' 
'"A_CREATED_BY_ID"."USERMST") WHERE ' 
'"A_CREATED_BY_ID"."A_ID" = %s') 

I haben die Django-Dokumente für ManytoMany gelesen, die immer noch nicht in der Lage waren herauszufinden, was das Problem war.

aktualisieren: Dieses auf einem Legacy-Datenbank ist, und wir sind nicht mit Migrationen

Antwort

1

Da dies ein Vermächtnis Datenbank ist, hat Django nicht die Tabellen erstellen und somit nicht über die Zwischentabellen verwendet weiß durch die ManyToManyFields. Sie müssen Django wissen lassen, welche Tabellen für die Joins verwendet werden sollen. Zum Beispiel:

created_by_id = models.ManyToManyField(
    User, 
    through="ModelName" # the model name 
    db_table="table_name" # the table name in the DB for the join 
    db_column="user_id", # this one you could drop 
    related_name="created_by_id" 
) 

Sie eher dann die db_column im Modell angeben sollen, die Klasse A und Klasse Benutzer verbindet.

Auch Sie könnten class Meta zu Ihren Modellen hinzufügen:

class Meta: 
    managed = False 

Das ist es offensichtlich für alle macht, die den Code liest, dass die Datenbank nicht von Django verwaltet wird.

EDIT: Hier ist ein link zur offiziellen Dokumentation über die Option through.