web-dev-qa-db-fra.com

Django excluant un ensemble de requêtes d'un autre

J'ai les deux modèles suivants:

class DeliveryTime(models.Model):
   delivery_time = models.CharField(max_length=15)

class BlockedDeliveryTime(models.Model):
   delivery_date = models.DateField()
   delivery_time = models.ForeignKey(DeliveryTime) 

Je veux retourner tous les délais de livraison disponibles pour une journée, c'est-à-dire tous les DeliveryTime à l'exclusion du BlockedDeliveryTime.

 blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date)
 delivery_times = DeliveryTime.objects.all()

De delivery_times queryset je veux supprimer tout blocked_delivery_times.delivery_time

Comment puis je faire ça? Aucune suggestion?

33
reevh
blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
    .values('delivery‌​_time')
delivery_times = DeliveryTime.objects.exclude(id__in=blocked_delivery_times)
41
Paul Draper

Pour une version plus récente de Django (j'utilise 1.10), vous ne devez pas utiliser .objects pour la deuxième ligne.

blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
    .values('delivery‌​_time')
delivery_times = DeliveryTime.exclude(id__in=blocked_delivery_times)
7
Henry H

Avec la sortie de Django 1.11, vous pouvez utiliser difference , qui tire parti de l'opérateur SQL EXCEPT. Je pense que cela pourrait être plus efficace car vous n'évaluez pas une requête pour obtenir une liste de valeurs.

2
Harel