2016-07-12 22 views
0

Unten ist die meine models.py und eine Selbstreferenz Fremdschlüssel Beziehung gemacht.Erstellen Sie einen neuen Datensatz mit der selbstregenerierten Foreignkey-Relation

class emp_details(models.Model): 
    emp_id    = models.AutoField(primary_key = True) 
    emp_first_name  = models.CharField(max_length = 50,null = False) 
    emp_manager_id  = models.ForeignKey('self') 

a1 = emp_details(emp_first_name = "ramesh",emp_manager_id = 2) 
a1.save() 

Hier versuche ich neue Datensatz zu erstellen. Aber ich habe den folgenden Fehler:

ValueError: Cannot assign "'2'": "emp_details.emp_manager_id" must be a "emp_details" instance. 

Wie kann ich einen neuen Datensatz mit der selbstregenerierten Foreignkey-Beziehung erstellen?

Antwort

1

In Ihrem Fall ist emp_manager_id das Fremdschlüsselfeld, daher sollten Sie die ID emp_manager_id_id zuweisen.

a1 = emp_details(emp_first_name = "ramesh", emp_manager_id_id=2) 

Es wäre besser, die Feldnamen zu emp_manager zu ändern. Hinweis: Es wird empfohlen, CamelCase als Modellnamen zu verwenden. Daher ist EmpDetail besser als emp_details. Putting, dass zusammen, Sie haben:

class EmpDetail(models.Model): 
    emp_id = models.AutoField(primary_key = True) 
    emp_first_name = models.CharField(max_length = 50,null = False) 
    emp_manager = models.ForeignKey('self') 

Jetzt können Sie die ID emp_manager_id, dass emp_manager der Fremdschlüssel zugeordnet werden.

a1 = EmpDetail(emp_first_name="ramesh", emp_manager_id_id=2) 

Wenn Sie emp_manager auf das Objekt selbst festlegen möchten, dann müssen Sie das Objekt in der Datenbank zuerst speichern, so dass es einen Primärschlüssel bekommt.

a1 = EmpDetail(emp_first_name="ramesh") 
a1.save() 
a1.emp_manager = a1 # You could do 'a1.emp_manager_id = a1.id' instead 
a1.save() 

Damit dies funktioniert, werden Sie null=True auf den Fremdschlüssel festlegen müssen, so dass Sie ohne Einstellung emp_manager das Objekt speichern.

+0

Es funktioniert gut. Aber ich habe kleine Zweifel.Hier statt Wert 2.Wie kann ich die Selbst-Objekt-ID statt als statisches Argument übergeben.Bitte korrigieren Sie mich, wenn ich falsch liege. – user1335606

+0

Sie müssen das Objekt zuerst speichern, bevor Sie auf seine ID zugreifen können. Siehe meine aktualisierte Antwort. – Alasdair

+0

Es funktioniert. Vielen Dank – user1335606