Jaki related_name
argument jest przydatny dla pól ManyToManyField
i ForeignKey
pól? Na przykład, biorąc pod uwagę następujący kod, jaki jest efekt related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
więc jeśli wiesz, że go nie użyjesz, myślę, że to dobra rzecz. To oczywiście osobista opinia.+
oznacza, że nie twórz odwrotnej relacjiOdpowiedzi:
related_name
Atrybut określa nazwę odwrotnej zależności odUser
modelu z powrotem do swojego modelu.Jeśli nie zostanie określony
related_name
, Django automatycznie tworzy jedną używając nazwy swojego modelu z przyrostkiem_set
, npUser.map_set.all()
.Jeśli tak , np.
related_name=maps
WUser
modelu,User.map_set
nadal będzie działać, aleUser.maps.
składnia jest oczywiście nieco bardziej przejrzysta i mniej niezręczna; na przykład, jeśli masz obiekt użytkownikacurrent_user
, możesz użyć,current_user.maps.all()
aby uzyskać wszystkie instancjeMap
modelu, które są powiązanecurrent_user
.Dokumentacja Django zawiera więcej szczegółów.
źródło
related_name='maps+'
w powyższym przykładzie?related_name
,_set
nadal działa wdjango1.11 >
?related_name
określony,_set
już nie działa.Aby dodać do istniejącej nazwy związanej z odpowiedzią, należy koniecznie w przypadku, gdy w modelu znajdują się 2 FK, które wskazują tę samą tabelę. Na przykład w przypadku Zestawienia materiałów
Kiedy będziesz musiał uzyskać dostęp do tych danych, możesz używać tylko powiązanych nazw
Nie działa inaczej (przynajmniej nie byłem w stanie pominąć użycia nazwy pokrewnej w przypadku 2 FK do tej samej tabeli).
źródło
related_name
powinno być w liczbie mnogiej. Ponieważ relacje ForeignKey zwracają wiele obiektów.related_name
Argumentem jest również przydatna, gdy masz więcej skomplikowanych nazw pokrewnych klas. Na przykład, jeśli masz relację klucza obcego:Aby uzyskać dostęp do
UserMapDataFrame
obiektów z powiązanychUser
, domyślnym wywołaniem byłobyUser.usermapdataframe_set.all()
, co jest dość trudne do odczytania.Korzystanie z
related_name
pozwala określić prostszą lub bardziej czytelną nazwę, aby uzyskać odwrotną zależność. W takim przypadku, jeśli określiszuser = models.ForeignKey(User, related_name='map_data')
, połączenie będzie wtedyUser.map_data.all()
.źródło
Powiązany parametr nazwy jest właściwie opcją. Jeśli go nie ustawimy, Django automatycznie utworzy dla nas drugą stronę relacji. W przypadku modelu mapy Django utworzyłby
map_set
atrybut umożliwiający dostępm.map_set
w twoim przykładzie (m jest instancją klasy). Formuła używana przez Django to nazwa modelu, po której następuje łańcuch_set
. Powiązany parametr name w ten sposób po prostu zastępuje domyślny parametr Django, a nie zapewnia nowe zachowanie.źródło
prefetch_related
użyj do pobrania danych dla danych relacji wiele do wielu i wiele do jednego.select_related
jest wybranie danych z relacji jednej wartości. Oba są używane do pobierania danych z ich relacji z modelu. Na przykład budujesz model i model, który ma związek z innymi modelami. Kiedy nadejdzie żądanie, zapytasz również o dane ich relacji, a Django ma bardzo dobre mechanizmy dostępu do danych z ich relacji, tak jakbook.author.name
podczas iteracji listy modeli do pobierania danych ich relacji, Django tworzy każde żądanie dla każdego pojedynczego danych relacji. Aby temu zaradzić, mamyprefetchd_related
iselected_related
źródło