You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何根据SKU ID关联查询Change模型数据?

Django视图中根据SKU关联查询Change数据问题解决

问题背景

需要在Django的views.py中,根据传入的sku_id查询与该SKU关联的Change数据。

相关模型定义

Change类

class Change (models.Model):
    raw_current = models.ForeignKey(Raw, blank=True, null=True, on_delete=models.CASCADE, related_name='raw_current')
    raw_new = models.ForeignKey(Raw, blank=True, null=True, on_delete=models.CASCADE, related_name='raw_new')
    created_date = models.DateTimeField(default=timezone.now)  # когда была создана заявка

    def __str__(self):
      return self.raw_current.num

    def publish(self):
        self.created_date = timezone.now()
        self.save()

Raw类

class Raw (models.Model):
    num = models.CharField(max_length=200)  # артикул сырья
    name = models.CharField(max_length=200)  # наименование
    layer = models.CharField(max_length=200)  # название слоя на русском

    def __str__(self):
        return self.num +' ' + self.name

Sku类

class Sku (models.Model):
    num = models.CharField(max_length=200)  # артикул готоваой продукции (ГП)
    name = models.CharField(max_length=200)  # наименование ГП
    raw = models.ManyToManyField(Raw, blank=True, null=True)  # сырье
    weight = models.IntegerField(blank=True, null=True)  # вес
    photo = models.ImageField(blank=True, null=True,
                              upload_to="images/")  # фото
    type = models.ForeignKey(ProductsTypes, blank=True, null=True, on_delete=models.CASCADE)
    def __str__(self):
        return self.num + ' ' + self.name

原视图问题

原视图代码:

def change(request,sku_id):
    sku = Sku.objects.get(id=sku_id)
    list_change = Change.objects.filter(raw_current = sku.raw)
    return render(request, 'main/change.html', {'sku':sku,'list_change':list_change,'change':change,})

访问/change/1时触发TypeError:Field 'id' expected a number but got <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x10920d9f0>。

修改为以下代码后会返回全部Change数据,无法实现仅关联当前SKU的需求:

def change(request,sku_id):     
    sku = Sku.objects.get(id=sku_id)     
    list_change = Change.objects.all()     
    return render(request, 'main/change.html',{'sku':sku,'list_change':list_change,'change':change,})  

问题原因

Sku模型中的raw是多对多字段,直接调用sku.raw返回的是ManyRelatedManager管理器对象,而非具体的Raw实例集合,因此无法直接用于filter条件中的等值匹配。

解决方案

使用Django的字段查找语法,通过__in来匹配SKU关联的所有Raw实例:

def change(request, sku_id):
    sku = Sku.objects.get(id=sku_id)
    # 获取当前SKU关联的所有Raw对象,再查询raw_current属于这些Raw的Change数据
    list_change = Change.objects.filter(raw_current__in=sku.raw.all())
    return render(request, 'main/change.html', {'sku': sku, 'list_change': list_change})

扩展说明

  • 若需要同时匹配raw_new字段关联的Raw,可扩展过滤条件(需提前导入from django.db.models import Q):
    list_change = Change.objects.filter(
        Q(raw_current__in=sku.raw.all()) | Q(raw_new__in=sku.raw.all())
    )
    

内容的提问来源于stack exchange,提问作者Анастасия Ялымова

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:25:18