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
hatline_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?
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. –