Django kendi kendine başvuru yabancı anahtar


166

Ben genel olarak webapps ve veritabanı şeyler için yeniyim bu yüzden bu aptalca bir soru olabilir. Modelin (üst) başka bir örneğinin birincil kimliğine işaret eden bir alana sahip bir model ("CategoryModel") yapmak istiyorum.

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

Bunu nasıl yaparım? Teşekkürler!


2
Stilistik olarak, parentbunun yerine çağrılmasını öneririm parentId, çünkü my_category_model.parentbir örneği olacaktır CategoryModel. Django otomatik olarak parent_idilgili modelin birincil anahtarı olacak bir üye oluşturur .
10flow

Yanıtlar:


263

Bir modelin ismini ForeignKey'e dize olarak aktarabilirsiniz ve doğru olanı yapacaktır.

Yani:

parent = models.ForeignKey("CategoryModel")

Veya "self" dizesini kullanabilirsiniz

parent = models.ForeignKey("self")

55

Bir öz referansı belirtmek için 'öz' dizesini kullanabilirsiniz.

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey


7
Bence 'benlik' demek istiyorsun. Dizede olduğu gibi. benlik bu bağlamda tanımlanmamıştır
Jared Forsyth

1
@Brandon Cevabınızdaki 'benlik' yorumunda söylediklerinden nasıl farklı? "Sanırım" ben "demek istiyorsun !!! . Her ikisi de django belgelerine göre iyi olan dizedir. ! Herhangi bir ipucu
Stryker

1
Fark, selfmodel özelliği tanımlanırken mevcut olmamasıdır. Özellik, __init__()veya başka bir yöntemin parçası olarak tanımlanıyorsa self, her zaman bir Python sınıfının herhangi bir örnek yöntemine yönelik ilk konumsal argüman olduğu gibi olurdu .
Brandon


1

Ayrıca null = True ve blank = True

class CategoryModel(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)

null = True, veritabanında izin vermek için
blank = True, form doğrulamasında izin vermek için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.