Django:如何根据深层嵌套关系过滤查询集

时间:2018-10-02 09:03:12

标签: python django django-queryset django-1.11 django-q

免责声明:英语不是我的母语。我发现这个问题很难表述,因此可能是重复的。也许您可以建议一个更好的标题?

我正在尝试为嵌套关系做一个有效的查询集。我需要获得跨越多个多对多关系的关系。

让我为您提供我想到的模型和查询集,因为我确实找不到描述我的问题的词,但是我可以用代码轻松地表达它。请注意,为简洁起见,我省略了字段。

from django.conf import settings


class UserWaiterProfile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )


class Restaurant(models.Model):
    name = models.CharField()

    @cached_property
    def employees(self):
        return UserWaiterProfile.objects.filter(
            employment__restaurant=self, employment__status=1
        )


class Table(models.Model):
    number = models.PositiveSmallIntegerField()
    restaurants = models.ManyToManyField(Restaurant)


class Employment(models.Model):
    restaurant = models.ForeignKey(Restaurant)
    employee = models.ForeignKey(UserWaiterProfile)

有些用户可以通过雇用到指定餐厅成为员工。这些餐厅有桌子,一个桌子可以属于几个餐厅。给定一个表,我需要向与该表有关系的餐馆员工的所有用户发送一条消息。 这是当前查询:

# ... other imports
from fcm_django.models import FCMDevice
from django.contrib.auth import get_user_model


class SomeView(generics.GenericAPIView):
    def some_serializer_method(self, serializer):
        employments = Employment.objects.filter(restaurant__in=qr_code.table.restaurants.all())
        employees = UserWaiterProfile.objects.filter(employment__in=employments)
        user_queryset = get_user_model().objects.filter(userwaiterprofile__in=employees)
        fcm_devices = FCMDevice.objects.filter(
            user__in=user_queryset,
            active=True,
            name__icontains=SERVER_VALUES_FCM_WAITER_DEVICE_PREFIX
        )
        if fcm_devices.exists():
            fcm_devices.send_message(content_available=True, data={
                "data": serializer.data
            })

如您所见,我需要向在给定桌子的餐厅工作的员工所属的设备发送消息。 所以我的问题是:Django是否具有更好地执行此查询的功能? (在JavaScript中,我可以只嵌套过滤器,并使其成为一个内衬。)

0 个答案:

没有答案