免责声明:英语不是我的母语。我发现这个问题很难表述,因此可能是重复的。也许您可以建议一个更好的标题?
我正在尝试为嵌套关系做一个有效的查询集。我需要获得跨越多个多对多关系的关系。
让我为您提供我想到的模型和查询集,因为我确实找不到描述我的问题的词,但是我可以用代码轻松地表达它。请注意,为简洁起见,我省略了字段。
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中,我可以只嵌套过滤器,并使其成为一个内衬。)