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,提问作者Анастасия Ялымова
相关产品推荐
相关产品推荐

