2017-12-07 7 views
0

Ich habe ein Modell wie folgt:Django Anordnungsmodell Fremdschlüssel Attribute löschen, nachdem()

class RepairOrder(models.Model): 
user = models.ForeignKey(User) 
ro_number = models.IntegerField(validators=[MaxValueValidator(999999999999)]) 
service_writer = models.ForeignKey(ServiceWriter, null=True, blank=True) 
RO_STATUS_CHOICES = (
    ('P', 'Pending'), 
    ('O', 'Open'), 
    ('C', 'Closed') 
) 
ro_status = models.CharField(max_length=10, blank=False, choices=RO_STATUS_CHOICES) 
open_date = models.DateTimeField() 
closed_date = models.DateTimeField(null=True, blank=True) 
mileage = models.IntegerField(blank=False, validators=[MaxValueValidator(999999999999)]) 
line_number_1 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_1') 
line_number_2 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_2') 
line_number_3 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_3') 
line_number_4 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL 
            , related_name='line_number_4') 
line_number_5 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_5') 
line_number_6 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_6') 
line_number_7 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_7') 
line_number_8 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_8') 
line_number_9 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_9') 
line_number_10 = models.ForeignKey(JobLine, null=True, blank=True, on_delete=models.SET_NULL, 
            related_name='line_number_10') 
vehicle = models.ForeignKey(Vehicle, blank=False, related_name='vehicle') 

def __str__(self): 
    return str(self.ro_number) 

Einige dieser Objekte haben könnten

line_number_(1 through 5) 

zu einem Jobline Objekt zugeordnet und die verbleibenden Satz als Null. Andere RepairOrder Objekte können nur haben

line_number_(1 through 3) 

zu einem Jobline Objekt zugeordnet, während die als Null gesetzt bleiben. Aber bei der Erstellung eines RepairOrder Objekt der

line_number_(x) 

Attribute werden immer in aufsteigender Reihenfolge von 1.

Hier beginnt zugewiesen, was ich zu tun versuche: Nehmen wir an, ich eine RepairOrder haben, die

hat
line_number_(1 through 5) 

den JobLine-Objekten zugewiesen und der Rest wird als Nullwert zugewiesen. Ich möchte in der Lage, die Jobline Objekt dem

line_number_3 

Attribut eines RepairOrder Objekt und haben die übrigen gefüllt Attribute sind die

line_number_(1-4) 

Attribute dieses RepairOrder Objekt füllen angeordnet zugewiesen zu löschen.

Hier ist, was ich bisher versucht:

views.py 
def advanced_delete_line(request, pk, jl): 
user = request.user 

if request.method == "POST": 
    raise PermissionDenied 
else: 
    # Get RepairOrder object with pk passed in from url 
    ro_obj = RepairOrder.objects.get(pk=pk, user=user) 
    # Get attribute object of 'line_number_(jl passed in from url) 
    ro_line = getattr(ro_obj, "line_number_" + str(jl)) 
    # Delete this object 
    ro_line.delete() 
    # Get the object assigned to the next numerically higher attribute or RepairOrder object 
    x = int(jl) + 1 
    for i in range(10-int(jl)): # Only loop as many times is needed 
     # Get the object assigned to the next numerically higher attribute or RepairOrder object 
     line = getattr(ro_obj, "line_number_" + str(x)) 
     y = x - 1 
     # Assign the previously retrieved object to the next lower job_line_attribute 
     line_2 = setattr(ro_obj, "line_number_" + str(y), line) 
     if line is None: 
      pass 
     else: 
      line_2.save() 
     # Do it all over again but starting at the next numerically higher attribute 
     x += 1 

    return HttpResponseRedirect('/advanced/repair-order/' + str(pk) + "/") 

ich wenig mit dieser Methode kein Glück habe. Kann mir jemand einen besseren Weg geben, dies zu tun?

+0

Dies scheint wie die falsche Struktur. Sie brauchen eine Viele-zu-Viele-Beziehung. Um die Bestellung zu machen, können Sie eine Kette durch ein Modell mit einem Auftragsfeld haben. –

Antwort

0

Ich denke, Sie müssen line_2 nach dem Einstellen auf None das erste Mal speichern. Sehen Sie, ob diese Änderung in der For-Schleife hilft:

for i in range(10-int(jl)): # Only loop as many times is needed 
    # Get the object assigned to the next numerically higher attribute or RepairOrder object 
    line = getattr(ro_obj, "line_number_" + str(x)) 
    y = x - 1 
    # Assign the previously retrieved object to the next lower job_line_attribute 
    line_2 = setattr(ro_obj, "line_number_" + str(y), line) 
    line_2.save() 
    if line is None: 
     break 
    else: 
     # Do it all over again but starting at the next numerically higher attribute 
     x += 1 

return HttpResponseRedirect('/advanced/repair-order/' + str(pk) + "/") 
+0

Immer noch nicht den Trick. Ich bin neugierig, ob meine Methode nicht funktionieren wird. –

0

Ich konnte einige Probleme mit meiner Logik herausfinden. Ich habe die Funktion setattr() einer Variablen zugewiesen, wenn es nicht so funktioniert. Sie müssen die Funktion settattr() wie folgt verwenden:

replacement_value = "value" 
setattr(object, "attribute_name", replacement_value) 
object.save()