[英]Django complex filter through ManyToManyField and ForeignKey
我有許多通過 manytomany 和外鍵字段連接的數據庫表。
from django.db import models
class User(models.Model):
name = models.CharField(max_length=20)
class Bookings(models.Model):
user = user = models.ForeignKey(
User,
blank=True,
null=True,
on_delete=models.SET_NULL)
class Event(models.Model):
bookings = models.ManyToManyField(
Booking,
related_name="event_bookings",
blank=True)
class ScheduleManager(models.Manager):
def for_user(self, user):
"""
Returns a Schedule queryset for a given user object.
Usage:
user= User.objects.first()
Schedule.objects.for_user(user)
"""
qs = self.get_queryset()
#need to extend this to return Schedule qs
return qs
class Schedule(models.Model):
event = models.ForeignKey(
Event,
on_delete=models.CASCADE
)
objects = ScheduleManager()
我想通過調用 Schedule.objects.for_user(User) 將數據庫查詢到 output 給定用戶 object 的計划查詢集。
我一直在玩 prefetch_related 和 select_related 的組合,但沒有成功。
我可以通過使用一堆鏈接查詢和循環來獲得正確的 qs,但這不是最優雅的,而且我訪問數據庫的次數太多了。
任何幫助將不勝感激。
您可以通過將它們與__
分開來遍歷這些字段。
你想從Schedule
到達User
,路線如下:
時間表 --> 事件 --> 預訂 --> 用戶
所以,如果你從Schedule
開始,你可以通過這樣做來過濾用戶:
my_user = get_user_object().objects.get(pk=1)
user_schedules = Schedule.objects.filter(event__bookings__user=my_user)
因此,如果您將以上內容轉換為適合您的 function,您將得到:
class ScheduleManager(models.Manager):
def for_user(self, user):
"""
Returns a Schedule queryset for a given user object.
Usage:
user= User.objects.first()
Schedule.objects.for_user(user)
"""
qs = self.get_queryset()
qs = qs.filter(event__bookings__user=user)
return qs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.