Django фильтрует одну модель с помощью другой модели
У меня есть две модели, и обе имеют внешние ключи с моделью User:
class UserCostCenter(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
cost_center = models.PositiveIntegerField()
created_date = models.DateTimeField(auto_now_add=True)
start_date = models.DateField(null=False, blank=False)
end_date = models.DateField(null=True, blank=True)
class UserBooking(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
date = models.DateField()
hours = models.DecimalField()
task = models.ForeignKey(UserProject, on_delete=models.DO_NOTHING, null=True, blank=True)
created_date = models.DateTimeField(auto_now_add=True)
updated_date = models.DateTimeField(null=True, blank=True)
history = HistoricalRecords(table_name='booking_history_userbooking')
Теперь я хочу исключить пользовательские записи, у которых нет центра затрат. В настоящее время я делаю вот так:
queryset = UserBooking.objects.all()
for booking in queryset:
cost_center = UserCostCenter.objects.filter(
Q(user=booking.user, start_date__lte=booking.date, end_date__gte=booking.date)
| Q(user=booking.user, start_date__lte=booking.date,
end_date=None)).first()
if not cost_center:
queryset = queryset.exclude(id=booking.id)
Я не хочу исключать объекты бронирования пользователей с помощью цикла for, пожалуйста, помогите!
Вы можете получить все UserBookings с записью в UserCostCenter следующим образом:
UserBooking.objects.filter(user__in=(UserCostCenter.objects.values_list('user', flat=True)