Ich habe eine Legacy-Datenbank, in der einige Tabelle Composite-Primärschlüssel enthält. Das Modell, das ich bekomme, indem ich den Befehl manage.py inspectdb
läuft, sieht so aus.Arbeiten mit Composite-Primärschlüssel in Django-Projekt mit Legacy-Datenbank
class MyTable(models.Model):
field1_id = models.IntegerField(db_column='field1id', primary_key=True)
is_favorite = models.BooleanField(db_column='isfavorite', default=False, null=False)
is_admin = models.BooleanField(db_column='isadmin', default=False, null=False)
role = models.IntegerField(default=USER_GUEST, null=False)
field2 = models.BooleanField(null=False, default=True)
field3 = models.BooleanField(null=False, default=True)
is_active = models.BooleanField(db_column='isactive', null=False, default=True)
user = models.ForeignKey(
CustomUser, models.DO_NOTHING, db_column='userid', primary_key=True)
class Meta:
managed = False
db_table = 'mytable'
unique_together = (('user', 'field1_id'),)
Ich kann Daten normal abrufen. Das Problem tritt jedoch auf, wenn ich den Befehl save()
bei einer bestimmten Modellinstanz ausführen möchte. Die Abfrage, die django ausführt, ist nicht korrekt. Zum Beispiel:
>>> from web_services.apps.my_app.models import MyTable
>>> g = MyTable.objects.get(field1_id=12)
>>> g.is_active = True
>>> g.save()
>>> connection.queries[-1]
{'time': '0.000', 'sql': 'UPDATE `mytable` SET `isfavorite` = 0, `isadmin` = 1, `role` = 3, `field2` = 1, `field3` = 1, `isactive` = 1 WHERE `mytable`.`field1id` = 12'}
Aber ich brauche:
{'time': '0.000', 'sql': 'UPDATE `mytable` SET `isfavorite` = 0, `isadmin` = 1, `role` = 3, `field2` = 1, `field3` = 1, `isactive` = 1 WHERE `mytable`.`field1id` = 12' AND `mytable`.`userid` = 1'}
Da django nicht zusammengesetzte Primärschlüssel nicht unterstützt, was die beste Lösung wäre, dieses Problem zu überwinden? Beachten Sie, es ist Legacy-Datenbanktabelle und es hatte keine AutoField
.
EDIT: fügt Legacy-Tabellenstruktur
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| userid | int(11) | NO | PRI | NULL | |
| field1id | int(11) | NO | PRI | NULL | |
| isfavorite | int(11) | NO | | 0 | |
| isadmin | int(11) | NO | | 0 | |
| role | int(11) | YES | | NULL | |
| field2 | tinyint(1) | NO | | 1 | |
| field3 | tinyint(1) | NO | | 1 | |
| isactive | tinyint(4) | NO | | 1 | |
+------------+------------+------+-----+---------+-------+
Es wäre am besten, wenn Sie die Tabellenstruktur als auch hinzufügen. – e4c5
@ e4c5 hinzugefügt Legacy-Tabellenstruktur – AmirM