Джанго трёхстороннее соединение с использованием иностранных ключей - PullRequest
1 голос
/ 12 января 2012

Я недавно начал оценивать Django для миграции нашего архаичного веб-приложения, написанного 10 лет назад.В течение последних нескольких дней я читал документацию по Django, но не смог найти лучший способ добиться объединения базы данных в несколько таблиц в моем случае:

Model:

class Product(models.Model):
    productid = models.IntegerField(primary_key=True, db_column='ProductId') 
    productname = models.CharField(max_length=120, db_column='ProductName')

class Testcases(models.Model):
    testcaseid = models.IntegerField(primary_key=True, db_column='TestCaseId')
    testcasename = models.CharField(max_length=240, db_column='TestCaseName')

class Testmatrix(models.Model):
    testmatrixid = models.IntegerField(primary_key=True, db_column='TestMatrixId')
    productid = models.ForeignKey(Product, db_column='ProductId')
    testcaseid = models.ForeignKey(Testcases, db_column='TestCaseId')

class Status(models.Model):
    testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId')
    title = models.CharField(max_length=240, db_column='Title', blank=True)

(Примечаниеэта модель была сгенерирована inspectdb, и я бы предпочел не изменять ее в данный момент). Шаблон

View:

from django.shortcuts import render_to_response
from mysite.testmatrix.models import Product, Testcases, Testmatrix, Status

def get_products(request):
    tm = list(Testmatrix.objects.filter(productid='abc'))
    return render_to_response('products.html', {'tm': tm})

разработан на данный момент минимальным, чтобы помочь сосредоточиться на реальной проблеме в(views / model).

Template: (products.html)
{% extends "main.html" %}

{% block body %}
<table>
{% for tm in tm %}
    <tr>
            <td>{{ tm.testmatrixid }}</td>
    <td>{{ tm.testcaseid.testcasename }}</td>
    </tr>
{% endfor %}
</table>
{% endblock %}

Проблема:

Хотя я могу присоединиться к моделям Testmatrix и Testcase, я не могу создать эквивалентный набор запросов, объединив всеTestMatrix, TestCase, Записи о статусе, скажем, на произвово всех трех моделях (testmatrixid, productid, productname, testcaseid, testcasename).Однако я не уверен, как расширить этот автоматический внешний ключ, ссылающийся на модель состояния.Это было бы проще, если бы все внешние ключи были определены в самой Testmatrix.Но у Status есть внешний ключ для TestMatrix.

2) Я пытался использовать что-то вроде: records = Status.objects.filter (testmatrixid__productid = pid).Это снова дало мне набор запросов в результате присоединения к Testmatrix и Status, но не к Testcases.

Извините за любые грубые ошибки или ошибки.Это мой самый первый пост!

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Итак, вам нужно получить доступ к related_object .Это очень просто.

Во-первых, добавьте сюда related_name:

class Status(models.Model):
    testmatrixid = models.ForeignKey(Testmatrix, db_column='TestMatrixId', related_name='statuses')

Теперь вы можете получить все статусы для нужной Testmatrix, например

test_matrix.statuses.all()

Если выне хотите нажимать на DB, когда вы получаете доступ к statuses, не забудьте использовать select_related.

0 голосов
/ 12 января 2012

Без каких-либо конкретных сообщений об ошибках трудно диагностировать причину указанных ошибок. Однако, в вашем примере, в views.get_products: tm = list(Testmatrix.objects.filter(productid='abc')) не будет работать, потому что 'abc' - это строка, а ваш productid на самом деле является объектом Product (а не просто целым числом, даже если поле является целочисленным внешним ключом для вашего справочная таблица рк); Вы можете сделать tm = list(Testmatrix.objects.filter(productid=Product.objects.get(product_name='abc')), предполагая, что 'abc' является названием продукта записи о продукте. Когда вы устанавливаете поле в models.ForeignKey (...), вы обращаетесь к этой ссылочной записи как к объекту, а не к идентификатору.

Кроме этого, ничего особенного, ваш шаблон выглядит солидно, а ваши модели выглядят хорошо для меня. Я бы предложил создать несколько тестовых случаев, чтобы увидеть, где находятся ошибки: Django Testing ; Кроме того, this также является отличным учебным пособием для понимания TDD и модульного тестирования с Django. Используя юнит-тесты, вы можете проверить каждый шаг вашего приложения и с уверенностью делать будущие обновления.

...