dodatkowe warunki dołączenia do django


Czy można dodać dodatkowy warunek do instrukcji join generowanej przez ORM django?
Czego potrzebuję w SQL
'SELECT "post"."id", COUNT("watchlist"."id") FROM "post" 
LEFT OUTER JOIN "watchlist"
ON ("post"."id" = "watchlist"."post_id" AND "watchlist"."user_id" = 1)
WHERE "post"."id" = 123 GROUP BY …

W Django roku większość
Post.objects.annotate(Count('watchinglist')).get(pk=123)

Ale jak mogę dodać
AND "watchlist". "User_id" =…
do stanu JOIN za pomocą django ORM?
Dodanie go do filtra nie pozwala na uzyskanie obiektów pocztowych bez powiązanych obiektów na liście obserwacji.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W Django v2.0

FilteredRelation
https://docs.djangoproject.com ... jects
Post.objects.annotate( t=FilteredRelation( 'watchlist', condition=Q(watchlist__user_id=1)).filter(t__field__in=...)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Krótka odpowiedź brzmi: pod pewnymi warunkami, tak.
Kiedy budowa pozostała dołącza do ogólnegoForeignkey, połączenia Django

GenericRelation.get_extra_restriction
https://github.com/django/djan ... 3L437
który dodaje dodatkowy stan do sugestii z limitem "Content_type_id".
W przypadku „ForeignKey” ta metoda jest również nazywana return none.
Możesz użyć tego miejsca, aby umieścić dodatkowe ograniczenia w klauzuli ON, jeśli możesz zorganizować kod tak, aby uzyskać prawidłowe parametry ograniczenia w określonym czasie.
class UserForeignKey(models.ForeignKey): def get_extra_restriction(self, where_class, alias, related_alias):
field = self.model._meta.get_field('user')
cond = where_class()
# Here is a hack to get custom condition parameters
value = SomeContextManager.get_needed_value() lookup = field.get_lookup('exact')(field.get_col(related_alias), value)
cond.add(lookup, 'AND')
return condclass WatchList(models.Model): user = UserForeignKey(User)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Post.objects.annotate(Count('watchinglist')).filter(pk=123).extra(where=['"watchlist"."user_id" = 1'])

Miłego kodowania.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się