Как создать внешний ключ из нескольких моделей по одному полю в django
у меня есть несколько моделей, например,
class Service1(models.Model)
class Service2(models.Model)
class Service3(models.Model)
class Service4(models.Model)
class Orders(models.Model):
user = models.ForeignKey(User, on_delete=models.CASECAD)
orders = models.ForeignKey((Service1, Service2, Service3, Service4), on_delete=models.CASECAD)
как можно создавать заказы с разными сервисами, как описано выше
Я не совсем понимаю, что вы пытаетесь сделать без всех деталей, но почему вы не можете просто иметь 'Services' в качестве внешнего ключа и иметь Service1, Service2, Service3, Service4 как объекты в объектах в Services?
class Services(models.Model)
service = (
('Service1', ('Service1')),
('Service2', ('Service2')),
('Service3', ('Service3')),
('Service4', ('Service4')),
)
name = models.CharField(choices=service)
class Orders(models.Model)
orders = models.ForeignKey(Services,)
Лучший вариант, который я придумал, это установить внешние связи в противоположном направлении:
class Service1(models.Model):
price = models.FloatField()
description = models.TextField()
order = models.ForeignField(Order, on_delete=models.PROTECT, related_name='services1')
class Service2(models.Model):
price = models.FloatField()
monthly_binifit = models.CharField()
description = models.TextField()
order = models.ForeignField(Order, on_delete=models.PROTECT, related_name='services2')
class Service3(models.Model):
price = models.FloatField()
free_contact = models.IntegerField()
monthly_binifit = models.CharField()
order = models.ForeignField(Order, on_delete=models.PROTECT, related_name='services3')
class Service4(models.Model)
price = models.FloatField()
monthly_binifit = models.CharField()
description = models.TextField()
other_binifit = models.CharField()
order = models.ForeignField(Order, on_delete=models.PROTECT, related_name='services4')
class Orders(models.Model):
user = models.ForeignKey(User, on_delete=models.CASECAD)
Таким образом, вы можете запросить услуги, связанные с заказом, по одному типу за раз:
order = Order.objects.get(id=1)
services_1 = order.services1.all()
services_2 = order.services2.all()
services_3 = order.services3.all()
services_4 = order.services4.all()
Вы не можете. Но вы можете фильтровать объекты в вашей функции, чтобы достичь объекта определенного класса.