Tôi có cơ sở dữ liệu cũ, trong đó một số bảng chứa khóa chính kết hợp. Mô hình tôi nhận được bằng cách chạy lệnh manage.py inspectdb
giống như thế này.Làm việc với khóa chính kết hợp trong dự án django với cơ sở dữ liệu kế thừa
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'),)
Tôi có thể tìm nạp dữ liệu bình thường. Tuy nhiên, vấn đề phát sinh khi tôi muốn chạy lệnh save()
trên một số phiên bản mẫu. Truy vấn django thực thi không đúng. Ví dụ:
>>> 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'}
Nhưng tôi cần:
{'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'}
Kể từ django không hỗ trợ khóa chính composite, những gì sẽ là giải pháp tốt nhất để khắc phục vấn đề đó? Lưu ý, đó là bảng cơ sở dữ liệu cũ và nó không có AutoField
.
EDIT: thêm cấu trúc bảng di sản
+------------+------------+------+-----+---------+-------+
| 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 | |
+------------+------------+------+-----+---------+-------+
Sẽ tốt nhất nếu bạn thêm cấu trúc bảng. – e4c5
@ e4c5 đã thêm cấu trúc bảng kế thừa – AmirM