Django:如何识别对象是否通过ManyToManyField连接?

标签 django django-models django-queryset

我的模型的基本表示:

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/

相关文章:

Django - 如何获得前 10 个最高分数,但将其限制为每个用户的单个分数?

django - values_list 在自定义模型字段中不使用 to_python?

python - ModelSerializer 是否应该按 View 编写?

django - Uploadify 3.1 尝试上传到 Amazon S3 (SignatureDoesNotMatch)

带有 ManyToManyField 的 Django 自定义管理器

django - 从 ImageField 覆盖 _get_url()

python - 如何在 Django 中设置站点框架

python - Django Query distinct values 有效但我不能使用查询结果

Django 应用程序似乎使用旧的 QuerySet 结果来处理基于 date.today() 过滤的新请求

Django查询集动态过滤