我有模型Car
,Seat
并且Seat
有一个外键Car
。
在模型.py 中:
class Car(models.Model):
# ...
class Seat(models.Model):
car = models.ForeignKey(Car)
# ...
在管理界面中,可以在添加/更改汽车时将座位添加到汽车(使用内联字段)。
在 admin.py 中:
class CarAdmin(admin.ModelAdmin):
# ...
inlines = [SeatInline]
class SeatInline(admin.StackedInline):
model = Seat
extra = 1
当用户通过添加/更改/删除汽车或添加/更改/删除座位时CarAdmin
,我需要记录他所做的事情,因此需要特别比较更改前后的所有座位。
问题是:
如何获取两个座位对象列表seats_before
并seats_after
进行比较?这需要在我可以访问的地方完成request.user
。
我试图在 中这样做save_formset()
,但没有奏效。问题之一:要获取seats_after
,显然只能获取已修改的席位列表,即无法区分未更改的席位和已删除的席位。
def save_formset(self, request, form, formset, change):
# ...
instances = formset.save(commit=False)
seats_after = []
for instance in instances:
if isinstance(instance, Seat):
seats_after.append(instance) # Unchanged seats are not added here
# ...
我也很难进入seats_before
这个功能。
编辑:
按照 defuz 的建议,我尝试了这段代码:
def save_related(self, request, form, formsets, change):
car_before = form.save(commit=False)
seats_before = car_before.seats_set.all()
form.save_m2m()
seats_after = []
for formset in formsets:
instances = formset.save()
for instance in instances:
if isinstance(instance, Seat):
seats_after.append(instance)
在这个例子中,有两个问题:
seats_before
似乎包含新座位而不是旧座位,就像保存表单时保存了相关对象一样。seats_after
仅包含更改/添加的座位。不会出现未更改和已删除的席位(我希望包括未更改的席位)。