在Django中获取ManytoMany对象



我正在努力解决一个问题。就像我有两个模型服务和包。套餐与服务有多对多的关系。我想得到与包表没有任何多对多关系的服务名称。如何做到这一点?我试过多种方法。

#型号.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')

将相关名称添加到包模型中,如下所示:

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

然后试试这个:

Service.objects.filter(packages__is_null=True)

最新更新