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, ...)