Django Admin filter_horizontal использует неверный первичный ключ и вызывает нарушение ограничений
Вот связанные модели:
Пункт заказа услуг:
class ServiceOrderItem(models.Model):
id = models.AutoField(primary_key=True, verbose_name="ServiceOrderItem ID")
service_order = models.ForeignKey(ServiceOrder, on_delete=models.RESTRICT)
service = models.IntegerField(choices=settings.SERVICE_TYPE_CHOICES)
notes = models.TextField(blank=True)
in_service_date = models.DateTimeField(null=True, blank=True, default=None)
cost = models.FloatField()
term = models.IntegerField()
active = models.BooleanField(default=True)
leases = models.ManyToManyField(
to="Location",
symmetrical=True,
null=True,
blank=True,
default=None,
)
def __str__(self):
return f"Item {self.pk} in Service Order {self.service_order.pk}"
Местоположение:
class Location(models.Model):
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
common_name = models.CharField(max_length=200, verbose_name="Location")
parent_location = models.ForeignKey("self", blank=True, on_delete=models.RESTRICT, null=True, default=None)
used_slots = models.IntegerField(default=1)
slot_index = models.IntegerField(default=1)
company = models.ForeignKey(Company, on_delete=models.RESTRICT)
location_type = models.IntegerField(choices=settings.LOCATION_CHOICES)
city = models.ForeignKey(City, on_delete=models.RESTRICT, null=True, blank=True)
county = models.ForeignKey(County, on_delete=models.RESTRICT, null=True, blank=True)
address_line = models.CharField(max_length=200, blank=True)
location_point = models.PointField(default=None, null=True, blank=True)
zipcode = models.CharField(max_length=30, blank=True)
def __str__(self):
return f"{self.get_full_location()}"
def get_description_for_admin(self):
if self.county is not None:
return f"{self.city.name}, {self.county.state.name}"
elif self.parent_location is not None:
return self.parent_location.get_description_for_admin()
else:
return None
def get_description_for_device(self):
result = ""
if self.location_type in (8, 6, 5):
result = f"{self.parent_location.get_description_for_device()}{self.common_name}"
elif self.location_type in (1, 9) or (self.location_type == 2 and self.city is not None):
result = f"{self.county.state.abbreviation}-{self.city.name}-"
else:
if self.parent_location is not None:
result = self.parent_location.get_description_for_device()
return result
def get_full_location(self):
result = f"{self.common_name}"
if self.parent_location is not None:
result = f"{self.parent_location.get_full_location()}-{result}"
return result
элемент администратора:
class ServiceOrderItemAdmin(admin.ModelAdmin):
list_display = ['get_name', 'service', 'in_service_date', 'cost', 'term', 'active']
search_fields = ['id']
list_filter = [
('service_order__id', DropdownFilter),
('service_order__contract__common_name', DropdownFilter),
('service', ChoiceDropdownFilter)
]
def get_name(self, obj):
return f"Service Order Item {obj.pk}"
get_name.short_description = "Service Order Item"
fieldsets = (
(None, {
'fields': ('notes', 'service', 'service_order')
}),
("DETAILS", {
'classes': ('collapse',),
'fields': ('in_service_date', 'cost', 'term', 'active')
}),
("LEASES", {
'classes': ('collapse',),
'fields': ('leases',)
}),
)
filter_horizontal = ['leases']
inlines = [OffnetServiceInline]
соответствующие данные базы данных (тестовые данные):
location:
----------------------------------
id common_name
1 Home
2 RR100
3 A1
4 A2
5 A3
7 A4
8 Home Clearfield
9 L1
10 L2
11 L3
12 Home Entrance
----------------------------------
service order item:
id service notes in_service_date cost term active service_order_id
1 1 Ha 2022-04-13 17:01:51.000 -0500 0.0 1 true 1
трассировка стека:
переадресация должна быть от ServicOrderItem(1) к Location(12)
но похоже, что он пытается выполнить ServicOrderItem(12) для Location(1)
Я понятия не имею, почему это происходит и что делать, чтобы это исправить.