Django Filter __в нескольких полях и нескольких моделях
Я пытаюсь отфильтровать несколько полей в моделях и получить точное соответствие.
Я застрял здесь. Если я выбираю один Tube
Продукт, то Machine
Модель показывает 102 продукта. А если я выбираю Tube
+ Drum
Продукт, то он показывает 190 продуктов. (Должен быть соответствующий продукт, но в моем случае этого не происходит)
models.py
class Machine(models.Model):
name = models.CharField(max_length=1330)
code = models.CharField(max_length=1500,null=True, blank=True
block = models.CharField(max_length=1500,null=True, blank=True)
compatable = models.CharField(max_length=1500,null=True, blank=True)
.
.
def __str__(self):
return str(self.id)
class Motor(models.Model):
name = models.CharField(max_length=1330)
code = models.CharField(max_length=1500,null=True, blank=True)
code1 = models.CharField(max_length=1500,null=True, blank=True)
code2 = models.CharField(max_length=1500,null=True, blank=True)
.
.
def __str__(self):
return str(self.id)
class Tube(models.Model):
name = models.CharField(max_length=1330)
block = models.CharField(max_length=1500,null=True, blank=True)
block1 = models.CharField(max_length=1500,null=True, blank=True)
block2 = models.CharField(max_length=1500,null=True, blank=True)
.
.
def __str__(self):
return str(self.id)
class Drum(models.Model):
name = models.CharField(max_length=1330)
compatable = models.CharField(max_length=1500,null=True, blank=True)
compatable1 = models.CharField(max_length=1500,null=True, blank=True)
compatable2 = models.CharField(max_length=1500,null=True, blank=True)
.
.
def __str__(self):
return str(self.id)
Если мы выбираем по одному продукту из каждой модели "Motor, Tube & Drum"
и все данные попадают в модель CART
, то запрос должен отфильтровать 3 поля, сопоставить и показать продукты Exact Machine и наоборот.
Я сделал что-то подобное в views.py
def machine(request):
combine = CartMotor.objects.values_list('motor__code', flat = True)
combine1 = CartMotor.objects.values_list('motor__code1', flat = True)
combine2 = CartMotor.objects.values_list('motor__code2', flat = True)
combine3 = CartTube.objects.values_list('tube__block', flat = True)
combine4 = CartTube.objects.values_list('tube__block1', flat = True)
combine5 = CartTube.objects.values_list('tube__block2', flat = True)
combine6 = CartDrum.objects.values_list('drum__compatable', flat = True)
combine7 = CartDrum.objects.values_list('drum__compatable1', flat = True)
combine8 = CartDrum.objects.values_list('drum__compatable2', flat = True)
combine9 = combine.union(combine1, combine2, all= True)
combine10 = combine3.union(combine4, combine5, all= True)
combine11 = combine6.union(combine7, combine8, all= True)
combine12 = combine9.union(combine10, combine11, all= True)
machine = Machine.objects.filter(Q(code__in=combine9) | Q(block__in=combine10) | Q(compatable__in=combine11)) if combine12 else Machine.objects.all().order_by('id')
Но после этого он не фильтрует правильный точный результат. Посмотрите код выше и дайте мне сказать, где я ошибаюсь.