Mam schemat DB, który odziedziczyłem po pewnym starszym kodzie. Teraz zamierzamy użyć Django do odzwierciedlenia tabel w modele. Oznacza to, że nie mogę wygenerować tabel przy użyciu modeli django. Schemat tabela wygląda tak: -Jak uzyskać identyfikator klucza podstawowego, który jest automatycznie generowany w modelach Django
mysql> desc student_profile;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| joining_on | datetime | YES | | NULL | |
| brothername | varchar(45) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
Teraz model Django, że stworzyliśmy dla tego schematu wygląda następująco: -
class StudentProfile(models.Model):
id=models.IntegerField(primary_key=True)
joining_on=models.DateField()
brothername=models.CharField(max_length=45)
class Meta:
db_table="student_profile"
Kiedy wstawić wiersz do tego tak: -
StudentProfile.objects.insert(brothername="Bro")
Wiersz został prawidłowo wstawiony. Ale nie mam sposobu na wyodrębnienie pola id. Wygląda na to, że ponieważ to pole nie jest AutoField
, django nie kopiuje na identyfikator, który został automatycznie wygenerowany przez MySql. Co mogę zrobić, aby uzyskać wartość id
, z którą utworzono wiersz? Sprawdziłem (https://code.djangoproject.com/ticket/8799#comment:1) i wygląda na to, że jest zgodne z projektem. Ale nadal potrzebuję sposobu, aby dostać się do id
i mieć odzwierciedlenie w modelu StudentProfile
. Co mogę zrobić?
Jednym z rozwiązań może być zastąpienie domyślnego save()
i jawne dostarczenie id
do modelu save()
. Ale czy to właściwa droga? Baza danych (to MySql) zapewnia sposób generowania identyfikatora i muszę być w stanie wykorzystać ten fakt na swoją korzyść, zamiast utrzymywać bieżący licznik przez aplikację. Jakieś wskazówki?
Co się stanie, jeśli nie zdefiniowania pola 'id' w modelu w ogóle? – Selcuk
Jeśli tego nie zrobię, Django automatycznie utworzy pole typu project.app.StudentProfile.id lub coś w tym stylu. Oczywiście mój podstawowy schemat nie ma tego nazwanego jako kolumna. Krótko mówiąc, chcę wszystkiego, co zapewnia "AutoField" Django, tylko że chcę, aby nazwa była moja. – abhayAndPoorvisDad
Django utworzy domyślnie kolumnę o nazwie "id", która jest taka sama jak twoja starsza kolumna. 'project.app.StudentProfile.id' to nazwa pola w kodzie Pythona, nie jest to nazwa colum bazy danych. Jesteś pewien, że to nie działa w ten sposób? – Selcuk