как создать внешний ключ из нескольких моделей в одном поле в django

#django #django-models

Вопрос:

у меня есть несколько моделей, таких как,

 class Service1(models.Model):
   price = models.FloatField()
   description = models.TextField()

class Service2(models.Model):
   price = models.FloatField()
   monthly_binifit = models.CharField()
   description = models.TextField() 

class Service3(models.Model):
   price = models.FloatField()
   free_contact = models.IntegerField()
   monthly_binifit = models.CharField()
 
class Service4(models.Model)
   price = models.FloatField()
   monthly_binifit = models.CharField()
   description = models.TextField()
   other_binifit = models.CharField()

class Orders(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASECAD)
     orders = models.ForeignKey((Service1, Service2, Service3, Service4), on_delete=models.CASECAD)
 

как это возможно для создания заказов с различными услугами, как описано выше

Ответ №1:

Я не совсем понимаю, что вы пытаетесь сделать без всех подробностей, но почему вы не можете просто иметь «Службы» в качестве внешнего ключа и иметь Service1, Service2, Service3, Service4 в качестве объектов в объектах в службах?

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

Комментарии:

1. у меня есть разные сервисы с разными полями, например, у меня есть режим сервиса1, в нем есть 3 поля (цена, описание, функции), 2-я сервиса2, в нем 6 полей (цена, местоположение, ежемесячная оплата, адрес, документы, контакты) и т. Д., Поэтому невозможно создать 1 модель сервиса с различными вариантами. вот почему мне нужно вызвать все модели служб в одном поле, чтобы выбрать любую из этих служб .

Ответ №2:

Лучший вариант, который я предлагаю, — это направить внешние отношения в противоположном направлении:

 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()
 

Ответ №3:

Ты не можешь. Но вы можете фильтровать объекты в своей функции, чтобы найти объект определенного класса.