Odwołujący się do siebie klucz obcy Django


165

Jestem trochę nowy w aplikacjach internetowych i ogólnie rzeczach z bazami danych, więc może to być głupie pytanie. Chcę utworzyć model („CategoryModel”) z polem wskazującym na podstawowy identyfikator innego wystąpienia modelu (jego elementu nadrzędnego).

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

Jak mam to zrobic? Dzięki!


2
Stylistycznie sugerowałbym nazywanie tego parentzamiast parentId, ponieważ my_category_model.parentbędzie to przykład CategoryModel. Django automatycznie utworzy parent_idskładową, która będzie kluczem podstawowym powiązanego modelu.
10flow

Odpowiedzi:


262

Możesz przekazać nazwę modelu jako ciąg do ForeignKey i zrobi to dobrze.

Więc:

parent = models.ForeignKey("CategoryModel")

Możesz też użyć ciągu „siebie”

parent = models.ForeignKey("self")

55

Możesz użyć ciągu „self”, aby wskazać odniesienie do siebie.

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

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


7
Myślę, że masz na myśli „siebie”. Jak w sznurku. self jest niezdefiniowane w tym kontekście
Jared Forsyth

1
@Brandon W jaki sposób wyrażenie „ja” w Twojej odpowiedzi różni się od tego, co powiedział jared w swoim komentarzu? „Myślę, że masz na myśli siebie” !!! . Oba są ciągami znaków, co jest w porządku według dokumentacji django. ! Wszelkie wskazówki
Stryker

1
Różnica polega na tym, że selfnie występuje podczas definiowania właściwości modelu. Gdyby właściwość została zdefiniowana jako część metody __init__()lub innej metody, byłby to, jak selfzawsze, pierwszy argument pozycyjny dowolnej metody instancji klasy Pythona.
Brandon


1

Możesz także ustawić null = True i blank = True

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

null = True, aby zezwolić w bazie danych na
puste = True, aby zezwolić na walidację formularza

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.