2013-12-17 3 views
0

SQL, я хочу сделать это -Джанго - внутреннее соединение QuerySet не работает

SELECT jobmst_id, jobmst_name, jobdtl_cmd, jobdtl_params FROM jobmst 
INNER JOIN jobdtl ON jobmst.jobdtl_id = jobdtl.jobdtl_id 
WHERE jobmst_id = 3296 

Я только имел успех один раз внутреннее соединение в Джанго офф annote и order_by, но я не могу кажется, чтобы заставить его работать, делая либо prefetch_related() или select_related()

Мои модели являются так -

class Jobdtl(models.Model): 
    jobdtl_id = models.IntegerField(primary_key=True) 
    jobdtl_cmd = models.TextField(blank=True) 
    jobdtl_fromdt = models.DateTimeField(blank=True, null=True) 
    jobdtl_untildt = models.DateTimeField(blank=True, null=True) 
    jobdtl_fromtm = models.DateTimeField(blank=True, null=True) 
    jobdtl_untiltm = models.DateTimeField(blank=True, null=True) 
    jobdtl_priority = models.SmallIntegerField(blank=True, null=True) 
    jobdtl_params = models.TextField(blank=True) # This field type is a guess. 
    class Meta: 
     managed = False 
     db_table = 'jobdtl' 

class Jobmst(MPTTModel): 
    jobmst_id = models.IntegerField(primary_key=True) 
    jobmst_type = models.SmallIntegerField() 
    jobmst_prntid = TreeForeignKey('self', null=True, blank=True, related_name='children', db_column='jobmst_prntid') 
    jobmst_name = models.TextField(db_column='jobmst_name', blank=True) 
# jobmst_owner = models.IntegerField(blank=True, null=True) 
    jobmst_owner = models.ForeignKey('Owner', db_column='jobmst_owner', related_name = 'Jobmst_Jobmst_owner', blank=True, null=True) 
    jobmst_crttm = models.DateTimeField() 
    jobdtl_id = models.ForeignKey('Jobdtl', db_column='jobdtl_id', blank=True, null=True) 
    jobmst_prntname = models.TextField(blank=True) 
    class MPTTMeta: 
     order_insertion_by = ['jobmst_id'] 
    class Meta: 
     managed = True 
     db_table = 'jobmst' 

у меня есть очень простой вид, как так -

# Test Query with Join 
def test_queryjoin(request): 
    queryset = Jobmst.objects.filter(jobmst_id=3296).order_by('jobdtl_id') 
    queryresults = serializers.serialize("python", queryset, fields=('jobmst_prntid', 'jobmst_id', 'jobmst_prntname', 'jobmst_name', 'jobmst_owner', 'jobdtl_cmd', 'jobdtl_params')) 
    t = get_template('test_queryjoin.html') 
    html = t.render(Context({'query_output': queryresults})) 
    return HttpResponse(html) 

Я пытался делать кучу вещей -

QuerySet = Jobmst.objects.all() prefetch_related()

QuerySet = Jobmst.objects.all() select_related()..

QuerySet = jobmst.objects.filter (jobmst_id = 3296) .order_by ('jobdtl_id')

несколько других, а я забыл.

Каждый раз, когда json я получаю только из таблицы jobmst без упоминания результатов jobdtl, которые я хочу. Если я пойду другим путем и сделаю Jobdtl.objects.xxxxxxxxx то же самое, это не даст мне результаты от другой модели.

Чтобы отобразить, я хочу отображать поля из обеих таблиц, где выполняется определенное предложение.

Что дает?

ответ

1

Кажется, что я постоянно искал не то место. Исходя из SQL, я продолжал думать с точки зрения внутренних стыковых таблиц, которые не так работают. Я присоединяюсь к результатам моделей.

Следовательно, переосмыслив мой поиск, я наткнулся на itertools и функцию цепочки.

теперь у меня есть 2 запросов в соответствии с опр в моем views.py

from itertools import chain 

jobmstquery = Jobmst.objects.filter(jobmst_id=3296) 
jobdtlquery = Jobdtl.objects.filter(jobdtl_id=3296) 
queryset = chain(jobmstquery, jobdtlquery) 
queryresults = serializers.serialize("python", queryset) 

Это показывает мне результаты из каждой таблицы «присоединился», как я хотел бы в SQL. Теперь я могу сосредоточиться на фильтрации результатов, чтобы дать мне то, что я хочу.

Помните люди, информация, вам нужно почти всегда, это просто вопрос зная, как искать это :)

1

Что вы ищете может быть это

queryset = Jobmst.objects.filter(id=3296).values_list(
    'id', 'name', 'jobmst_owner__cmd', 'jobmst_owner__params') 

Вы бы Получите результаты только с одним запросом, и вы сможете использовать сортировку с этим.

P.S. Исходя из SQL, вы можете найти отличные идеи, играющие с queryset.query (SQL, созданный django) в оболочке django.

Смежные вопросы