Получение объектов 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')
- Если вы хотите получить имя службы, вы можете использовать
variable_name = Service.objects.get(name = service_name)
- Если вы хотите получить имя услуги, используя модель пакета.
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)