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)

Я понятия не имею, почему это происходит и что делать, чтобы это исправить.
Вернуться на верх