簡體   English   中英

Django 通過 ManyToManyField 和 ForeignKey 進行復雜過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM