2016-03-03 7 views
5

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?

+1

Co się stanie, jeśli nie zdefiniowania pola 'id' w modelu w ogóle? – Selcuk

+0

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

+2

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

Odpowiedz

6

Można pominąć definiowania kolumny id całkowicie, czyli:

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" 

Django stworzy lub użyć kolumny autoIncrement nazwie id domyślnie, która jest taka sama, jak kolumna starszych.

Jeśli nazwa kolumna była inna, można użyć AutoField z inną nazwą, takich jak:

my_id = models.AutoField(primary_key=True)