Django многоразовое определение Many-to-one в обратном направлении

Я пытаюсь сделать отношения «многие-к-одному» многоразовыми.

Упрощенно, допустим, у меня есть:

class Car(models.Model):
    ...

class Wheel(models.Model):
    car = models.ForeignKey(Car)
    ...

Довольно просто. Однако что, если я хочу использовать свою модель Wheel также в другой модели, Bike? Могу ли я определить отношения в обратном порядке, на стороне «Один»?

Определение этого как Many-to-many на Vehicles будет означать, что один и тот же Wheel может принадлежать нескольким Vehicles, а это не то, чего я хочу.

Придется ли мне подклассифицировать Wheel на CarWheel и BikeWheel только для того, чтобы иметь возможность различать Foreignkey для каждого отношения? Кажется, что должно быть более чистое решение.

Если я правильно понимаю, вам нужно будет «подклассифицировать» родительскую модель. Например, Vehicle:

class Vehicle(models.Model):
    pass

class Bike(Vehicle):
    pass

class Wheel(models.Model):
    vehicle = models.ForeignKey(
        Vehicle, 
        on_delete=models.CASCADE,
        related_name='wheels',
    )

Теперь для доступа к экземплярам Wheel из экземпляра Bike:

bike = Bike.objects.first()
bike_wheels = bike.wheels.all()

Я никогда не использовал его сам, но это выглядит как вариант использования общих отношений - https://docs.djangoproject.com/en/5.1/ref/contrib/contenttypes/#generic-relations

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models


class Car(models.Model):
    ...

class Bike(models.Model):
    ...

class Wheel(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey("content_type", "object_id")
    ...
bike = Bike.objects.first()
bike_wheel = Wheel(content_object=bike, ...)

car = Car.objects.first()
car_wheel = Wheel(content_object=car, ...)
Вернуться на верх