Ich rufe eine Funktion auf, die einen Prozess startet, der länger dauert, viele verschiedene Dinge werden getan. Diese Funktion behandelt hauptsächlich Instanzen einer bestimmten Klasse, Item
. Diese Artikel sind nach verschiedenen Attributen kategorisiert: category1
, category2
und category3
.Stellen Sie sicher, dass Abfragegruppe zwischengespeichert wird
Jetzt gibt es ein anderes Modell, das eine Art von Regeln in diesen Kategorien gilt: Rule
mit many-to-many-Attributen: categories1
, categories2
und categories3
. Eine Regel gilt für eine Item
, wenn dieselbe Regel auf verschiedene Kategorien verweist, von denen nur eine angewendet werden sollte. Die Entscheidung, von denen eine durch eine bestimmte Logik ist definiert in Abhängigkeit verkapselt:
class Rule(models.Model):
warehouse = models.ForeignKey('Warehouse')
categories1 = models.ManyToManyField('Category1')
categories2 = models.ManyToManyField('Category2')
categories3 = models.ManyToManyField('Category3')
@staticmethod
def get_rules_that_applies(item):
rules = warehouse.rule_set.all()
if not rules.exists():
return None
# ... determine which rule applies to the item by filtering, etc.
return rule
Das Problem liegt in der get_rules_that_applies
Methode. Jedes Mal, wenn wir die Regel, die für einen bestimmten Artikel gilt, bekommen müssen, und lassen Sie mich noch einmal sagen, dass viele viele Dinge in den Prozess involviert sind, über den wir reden, warehouse.rule_set.all()
heißt.
Da die Regeln nicht während dieses Prozesses ändern, können wir nur alle Regeln im Warehouse zwischenspeichern, aber wie? Wie kann ich sicherstellen, dass warehouse = warehouse.rule_set.all()
zwischengespeichert wird und alle Filter- und QuerySet-Operationen, die auf diese Regeln einwirken, nicht die Datenbank treffen?
Was in get_rules_that_applies ist Lager? –
@DimaKudosh yeah Ich hätte es erwähnen sollen: das 'warehouse' ist wie das" master/context "-Objekt, wo der ganze Prozess passiert. Alles in der App dreht sich um eine einzelne "Warehouse" -Instanz. – dabadaba