2016-12-11 3 views
0

у меня есть:Джанго не в другой таблице (не используя ID)

Модели:

class Category(models.Model): 
    description = models.CharField(unique=True, max_length=200)       
    myfield = models.CharField(unique=True, max_length=200)       

class Car(models.Model): 
    categorys = models.ManyToManyField(Category) 
    myfield = models.CharField(unique=True, max_length=200)       

Я пытаюсь выполнить следующий запрос:

Car.objects.filter(category__id = c.id) 
      .exclude(myfield__in =      
        Category.objects.all() 
          .only('myfield') 
        ) 
      .order_by("id") 
      .first() 

Я ожидал найти в результате:

SELECT ... 
FROM `myapp_car` 
INNER JOIN `myapp_car_categorys` 
     ON (`myapp_car`.`id` = `myapp_car_categorys`.`car_id`)  
WHERE (... 
    AND NOT (`myapp_car`.`myfield` IN 
      (SELECT `myapp_category`.`myfield` FROM `myapp_category`))) 
ORDER BY `myapp_car`.`id` ASC LIMIT 1; 

Бу т я найти:

SELECT ... 
FROM `myapp_car` 
INNER JOIN `myapp_car_categorys` 
     ON (`myapp_car`.`id` = `myapp_car_categorys`.`car_id`)  
WHERE (... 
    AND NOT (`myapp_car`.`myfield` IN 
      (SELECT `myapp_category`.`id` FROM `myapp_category`))) 
ORDER BY `myapp_car`.`id` ASC LIMIT 1; 

мне нужно использовать myfield в выберите, не id:

(SELECT `myapp_category`.`myfield` FROM `myapp_category`) 

Как бы я получить этот результат?

ответ

1

Даже если вы используете only, он вернет объекты модели Category. Поэтому, если вы используете его для фильтрации, объекты категории будут использоваться для фильтрации, а для SQL - идентификаторы этих объектов категории.

Если вам нужно фильтровать по myfield значений на всех категорий объектов, а затем использовать values вместо:

....exclude(myfield__in=Category.objects.values('myfield'))