diff --git a/django.html b/django.html index 40c6b92..669a0e2 100644 --- a/django.html +++ b/django.html @@ -126,6 +126,25 @@ └── views.py + +
+

Outras coisas do manage.py

+ + +
@@ -387,6 +406,110 @@ print Products.order_set.all()

O nome da relacionamento reverso pode ser alterado com related_name.

+
+ +
+

Queries com AND

+ +

Queries onde todas as condições devem ser + satisfeitas podem ser feitas passando mais + parametros em filter.

+ +

+all_expensive_fruits = Order.objects.filter(
+    products__name__like='fruit',
+    price__gt=1000)
+						
+
+ +
+

Queryes com OR

+ +

Para queries com OR, deve-ser usar o objeto Q.

+ +

+all_fruits_or_expensive = Order.objects.filter(
+    Q(products__name__like='fruit') |
+    Q(price__gt=1000))
+						
+
+ +
+

Q

+ +

Q também pode ser usado para AND e queries mais + complexas.

+ +

+fruit_salad = Order.objects.filter(
+    Q(products__name__like='fruit') &
+    (Q(price__gt=1000) | Q(price=0))
+                        
+ +

É possível misturar Q + com filter normal, mas existe uma questão de + prioridades e é melhor nem pensar em misturar os + dois.

+
+ + +
+
+

CHOICES

+ +

É possível definir valores fixos para campos com + choices.

+ +

+class Order(models.Model):
+
+    """An order."""
+
+    CHOICES = (
+        ('M', 'Money'),
+        ('C', 'Credit card')
+    )
+
+    products = models.ManyToManyField(Product)
+    payment_type = models.CharField(max_length=1, choices=CHOICES)
+                        
+ +

O primeiro valor é o valor que será + registrado no banco; o segundo, apresentado num + ModelForm.

+
+ +
+

CHOICES

+ +

Para as queries, é preciso pedir o valor do campo, não do display.

+ +

+credit_card_orders = Order.objects.filter(payment_type='C')
+                        
+
+ +
+

CHOICES

+ +

Para facilitar a vida, usar contantes.

+ +

+class Order(models.Model):
+
+    """An order."""
+
+    MONEY = 'M'
+    CREDIT_CARD = 'C'
+
+    CHOICES = (
+        (MONEY, 'Money'),
+        (CREDIT_CARD, 'Credit card')
+    )
+
+credit_card_orders = Order.objects.filter(
+    payment_type=Order.CREDIT_CARD)
+