2 Stimmen

Bearbeitung von Listen in Python

Ich versuche, eine kleine Änderung an django lfs Projekt, das mir erlauben, Produkte ohne Bestände zu deaktivieren wird zu machen. Unfortunatelly Ich bin gerade erst anfangen, Python zu lernen, so habe ich große Schwierigkeiten mit seiner Syntax. Das ist, was ich zu tun versuche. Ich verwende die Methode 'is_variant', die tru zurückgibt, wenn mein Produkt ein Untertyp ist. Wenn es eine Variante ist, wende ich mich an das übergeordnete Produkt, erhalte seine aktiven Varianten und überprüfe ihre Bestände. Wenn der Bestand größer als 0 ist, ist die Variable active 0, sonst 1. Wenn nach dem Durchlaufen der Varianten 'active' immer noch 1 ist, setze ich die Variable active des übergeordneten Produkts auf false.

Ich schaffe es irgendwie nicht, dass es auf die richtige Weise funktioniert. Wenn ich :

   def deactivate(self):
        if self.is_variant():
            prod = self.parent
            prod.active = all(var.get_stock_amount() != 0 for var in prod.variants.filter(active=True))
        else:
            prod.active = self.get_stock_amount() != 0

        self.parent.save()

Es deaktiviert mein Produkt, egal ob die Varianten Vorrat haben oder nicht. Und wenn ich :

        inactive = 0
        if self.is_variant():
            prod = self.parent
            for s in prod.variants.filter(active=True):
                if s.get_stock_amount() == 0:
                    inactive = 1
                else:
                    inactive = 0
            if inactive == 1:
                prod.active = 0
            prod.save()
        else:
            if self.get_stock_amount() == 0:
                self.active = 0

            self.save()

Das Gleiche passiert, also wird mein Produkt jedes Mal deaktiviert.

Ich habe die Rückgabetypen in der Shell überprüft, und self ist eine Variante, und sie ist aktiv.

8voto

Felix Kling Punkte 751464

Erstens: Ich würde die Liste nicht als set da dies eine in Python eingebaute Methode ist (siehe set ). Verwenden Sie . append auf der Liste (Ihre Syntax ist einfach falsch und die Fehlermeldung, die Sie erhalten, sagt Ihnen das ausdrücklich ;) ) und Sie müssen die Liste vorher initialisieren:

def deactivate(self):
"""If there are no stocks, deactivate the product. Used in last step of checkout.
"""
if self.has_variants():
    sets = []
    for s in self.variants.filter(active=True):
        sets.append(s)  
    for var in sets:
        ...

Aber warum sollte man eine Liste im Voraus erstellen, wenn der einzige Zweck darin besteht, sie erneut zu überarbeiten? Sie können es einfach tun:

def deactivate(self):
"""If there are no stocks, deactivate the product. Used in last step of checkout.
"""
if self.has_variants():
    for s in self.variants.filter(active=True):   
        if s.get_stock_amount() == 0:
            inactive = True
        else:
            inactive = False
else:
    ...

Lesen Sie mehr über Listen .

2voto

hughdbrown Punkte 45214

Dieser Kodex ist in vielerlei Hinsicht falsch.

  1. Erstellung einer Liste mit dem Namen set (wie oben erwähnt)
  2. Mehrfaches Setzen einer Variablen in einer Schleife ohne Lesen
  3. Unnötiger Rückgabewert (wenn es nur eine Ausstiegsstelle gibt, wie kann dies nützlich sein?)

Ich denke, das würde genauso gut funktionieren:

def deactivate(self):
    """If there are no stocks, deactivate the product. Used in last step of checkout.
    """
    if self.has_variants():
        inactive = any(var.get_stock_amount() == 0 for var in self.variants.filter(active=True))
    else:
        inactive = self.get_stock_amount() == 0
    self.active = not inactive

oder vielleicht:

def deactivate(self):
    """If there are no stocks, deactivate the product. Used in last step of checkout.
    """
    if self.has_variants():
        self.active = all(var.get_stock_amount() != 0 for var in self.variants.filter(active=True))
    else:
        self.active = self.get_stock_amount() != 0

0voto

sasklacz Punkte 3540

Die richtige Lösung. Ich schätze, es gibt noch viel Platz, um es zu optimieren, aber zuerst muss ich lernen, wie :) :

def deactivate(self):
    """If there are no stocks, deactivate the product. Used in last step of checkout.
    """

    inactive = False

    if self.is_variant():
        prod = self.parent
        inactive = all(var.get_stock_amount() == 0 for var in prod.variants.filter(active=True))
        if inactive:
            prod.active = 0
        prod.save()
    else:
        if self.get_stock_amount() == 0:
            self.active = 0

        self.save()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X