Jak mogę dołączyć wewnętrzne do django?
Chcę pokazać w html nazwę miasta, stanu i kraju publikacji. Ale są w różnych tabelach.
Tutaj jest mój
models.py
class country(models.Model):
country_name = models.CharField(max_length=200, null=True)
country_subdomain = models.CharField(max_length=3, null=True)
def __str__(self):
return self.country_nameclass countrystate(models.Model):
state_name = models.CharField(max_length=200, null=True)
country = models.ForeignKey(country, on_delete=models.CASCADE, null=True)
importance = models.IntegerField(null=True)
def __str__(self):
return self.state_nameclass city(models.Model):
city_name = models.CharField(max_length=200, null=True)
countrystate = models.ForeignKey(countrystate, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.city_nameclass publication(models.Model):
user = ForeignKey(users, on_delete=models.CASCADE, null=False)
title= models.CharField(max_length=300, null=True)
country=models.ForeignKey(country, on_delete=models.CASCADE, null=True)
countrystate=models.ForeignKey(countrystate, on_delete=models.CASCADE, null=True)
city=models.ForeignKey(city, on_delete=models.CASCADE, null=True) def __str__(self):
return self.title
Oto moje views.py
def publications(request):
mypublications = publication.objects.filter(user_id=request.session['account_id'])
dic.update({"plist": mypublications })
return render(request, 'blog/mypublications.html', dic)
W widoku django, jaki jest odpowiednik następującego zapytania sql?
SELECT p.user_id, p.title, c.cuntry_id, c.country_name, s.state_id, s.state_name, y.city_id, y.city_name FROM publication AS p
INNER JOIN country AS c ON c.id = p.country_id
INNER JOIN countrystate AS s ON s.id = p.countrystate_id
INNER JOIN city AS y ON y.id = p.city_id
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
4 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
co jest naturalnym sposobem osiągnięcia tego celu:
Możesz sprawdzić wynikowy kod SQL za pomocą , co powinno dać wynik w następujących wierszach (przykład wzięty z zaplecza postgres):
Zwracane wartości kursora są następnie mapowane do odpowiednich instancji ORM, dzięki czemu podczas przeglądania tych publikacji można uzyskać dostęp do wartości powiązanych tabel za pośrednictwem ich własnych obiektów. Jednak te wywołania wzdłuż wstępnie wybranych relacji bezpośrednich nie spowodują dodatkowych wywołań bazy danych:
Anonimowy użytkownik
Potwierdzenie od:
InnerJoin implikuje „wspólną” sekcję między dwiema (lub więcej) tabelami. Każdy z nich jest wykonywany jeden po drugim, zgodnie z sugestią zapytania SQL.
przechodząc przez zapytanie SQL, patrzysz na publikację jako główną, wszystkie twoje zapytania są kluczami obcymi wewnątrz publikacji, co daje ci CAŁY zbiór danych.
jeśli dobrze rozumiem, to czego szukasz w odpowiedniku Django jest filtrem łańcuchowym (nie zapytaniem), ponieważ Q da ci wyniki z każdego Q osobno i połączy je, podczas gdy chcesz, aby wyniki z jednego zastosowano do drugiego .
(Nie wiem, co robi dic.update ({"plist": mypublications}), nie jest jasne ..
Rozwiązanie: # pobierz cały kraj w tabeli krajów. # pobierz wszystkie obiekty countrystate < code> city = city.objects.all () # pobierz wszystkie obiekty miasta
rozwiązanie 1: w python3 musisz użyć __in, działa to dobrze w Python2. i będziesz mieć kraj, coś z kraju (nie Nikt), tabelę countrystate (nikt nie ma), tabelę City (nikt), więc jeśli nic i od któregokolwiek z nich, to zapewni.
Uwaga: „Brak” (python) = „Null” (Baza danych SQL)
Pobierz wszystkie publikacje, które zawierają którekolwiek z powyższych (przyniosą prawie wszystko, co chcesz. # get if any one tych, w których „id” (na którym opiera się obiekt) pasuje, co czyni go samym złączeniem wewnętrznym.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Ponieważ Twój zestaw QuerySet jest określony w kontekście
dic ['plist']
, w szablonie możesz po prostu: