我的模型的基本表示:
class CarType(models.Model):
name = models.CharField(max_length=200)
class Brand(models.Model):
name = models.CharField(max_length=200)
cartype = models.ManyToManyField(CarType)
class Customer(models.Model):
name = models.CharField(max_length=200)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
我有一个搜索功能,可以轻松提供 CarType。我会通过它的 ID 来获取这个对象。
客户与品牌有联系,该品牌有多种车型(请忽略本例中的车型,它们仅用于说明目的)。
在我的查询中,我只想返回那些与品牌相关的客户,而该品牌又与车型存在多对多关系。
基本上;如何过滤客户以仅显示那些品牌与车型有关系的客户?
我目前的想法是:
- 是否可以创建某种模型管理器,它接受 CarType 作为参数并返回所有相关客户
- 为客户创建第二个模型,其中记录通过外键直接存储到 cartype(可能在添加客户时触发此操作)
- 为客户添加 CarType 的多对多字段,该字段会根据品牌中可用的现有记录自动创建所有多对多关系(并运行 cronjob 以根据品牌模型/对象的更改来审查/更新这些关系)。<
我需要查询尽可能通用且“简单”,但这个查询让我陷入困境。
编辑
添加更多上下文:我正在尝试根据存储在字典中的条件构建级联表单。这样,我应该能够轻松地为不同的形式回收我的代码,其中数据以不同的组合使用。
下面是我目前如何进行查询。它适用于一个简单的模型,直接搜索列中的文本(对于外键,这是通过例如国家/地区__名称)。
在某些搜索中,外键(如果已提供)应限制查询。因此,我尝试适应下面提到的有用逻辑,以便能够将查询限制为递归地满足对象 X 的那些记录。
### Initialize Q filter
filter_q = Q()
for x in columns:
filter_q |= Q(**{f'{x}__icontains': val})
headers = forms[htmx_form]['headers']
fields = forms[htmx_form]['columns']
fields.append('pk')
id_model = django.apps.apps.get_model(forms[htmx_form]['app'], forms[htmx_form]['model'])
results = id_model.objects.filter(filter_q).distinct()[:10]
results = results.values(*fields)
最佳答案
这是未经测试的代码,但您应该能够遍历模型。
您获取汽车类型:
car_type = CarType.objects.get(pk=1) # Example, this should be your code where you retrieve your car type
然后您可以使用此car_type
来过滤Customer
的查询集:
customers = Customer.objects.filter(brand__cartype__in=car_type)
关于Django:如何识别对象是否通过ManyToManyField连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76620966/