Получение объектов ManytoMany в Django

Я пытаюсь решить одну проблему. У меня есть две модели service и package. package имеет связь с service по принципу "многие ко многим". Я хочу получить имя сервиса, который не имеет никаких отношений "многие ко многим" с таблицей пакета. Как это сделать? Я уже пробовал несколько вариантов.

#models.py

class Service(models.Model):
    name = models.CharField(max_length=1000)
    price = models.IntegerField(null=True, blank=True, default=0)
    details = models.TextField(max_length=20000, blank=True, null=True)
    status = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Package(models.Model):
    service = models.ManyToManyField(Service, blank=True)
    name = models.CharField(max_length=220)
    price = models.IntegerField(null=True, blank=True, default=0)
    details = models.TextField(max_length=20000, blank=True, null=True)
    status = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

#views.py

    children_id_list = [2, 1, 4]
    temp = []
    
    for i in children_id_list:
        try:
            s = Service.objects.get(id=i)
            t = s.package_set.all()
            if len(t) == 0:
                children_id_list.remove(i)
                temp.append(i)
        except ObjectDoesNotExist:
            print(f'Sorry! There is no Service List with this ID {i}')


    print(children_id_list)
    print(temp)
    print(f"\n")
    package = Package.objects.filter(service__in=children_id_list).annotate(num_cats=Count('service')).filter(num_cats=len(children_id_list)).exclude(service__in=Service.objects.exclude(id__in=children_id_list))

    for i in package:
        print(f"Hello, Package Name {i.name} and Price {i.price} BDT")
        if len(temp) > 0:
            c = Service.objects.get(id=temp[0])
            print(f"Addon for new service {c.price} BDT")
            u = i.price + c.price
            print(f"Total Checkout {u} BDT")
            print(f"\n")
        else:
            print('None')
  1. Если вы хотите получить имя службы, вы можете использовать
variable_name =  Service.objects.get(name = service_name)
  1. Если вы хотите получить имя услуги, используя модель пакета.
variable_name =  Package.objects.get(service__name = service_name)

добавьте связанное имя к вашей модели пакета следующим образом:

class Package(models.Model):
    service = models.ManyToManyField(Service, blank=True, related_name="packages")

Тогда попробуйте следующее:

Service.objects.filter(packages__is_null=True)
Вернуться на верх