2009-10-22 8 views
2

J'ai:Comment interroger un modèle Django définissant une plage IP avec deux champs int (IP, masque)

class Range(models.Model): 
    ip = models.IntegerField() # as produced by socket.inet_aton + struct.unpack 
    mask = models.IntegerField() 

Étant donné un certain IP, comment puis-je obtenir toutes les gammes qui correspondent à cette adresse IP spécifique en utilisant les modèles Django? Si j'utilisais du SQL brut, j'utiliserais les opérateurs au niveau du bit de la base de données, mais l'ORM de Django ne les prend pas en charge.

Répondre

4

L'API QuerySet dans Django 1.0 inclut désormais la méthode 'extra', décrite here dans les documents Django. La méthode supplémentaire vous permet de passer des clauses WHERE personnalisées à votre QuerySet, ce qui devrait vous permettre d'utiliser la comparaison de bits dont vous avez besoin.

2

Pour effectuer une requête plus rapide en ajustant la plage, il est préférable de stocker les adresses IP inférieure et supérieure de la plage sous la forme d'un entier. Ensuite, la sélection des objets nécessaires devrait être aussi simple que Range.objects.filter(ip_low__le=ip, ip_up__ge=ip).

Questions connexes