Найти - Пользователи
Полная версия: Django + mysql + связь многое ко многим + вывод значений
Начало » Python для экспертов » Django + mysql + связь многое ко многим + вывод значений
1 2
Wojaovlad
Помогите. Делаю на django небольшое веб приложение основанное на работе с БД mysql. Есть две таблицы, связанные по типу многие ко многим третьей таблицей. В первой храняться названия производителей автомобилей (Audi, Alfa Romeo), во втрой модели автомобилей этих прозводителей (A4, Giulietta…), в третьей id полей предыдущих двух. Нужно вывести в index.html производителей, у меня их сейчас два, значит только два поля, в details.html модели автомобилей, производителя, который был выбран на index.html.

Я в models.py сделал класс для моделей, класс для связной таблицы, в котором через ForeignKey импортировал из класса моделей название и класс производителей, в котором импортировал из класса связной таблицы импортровал имя моделей по id. В index.html через for вывел производителей, в details.html через for попытался вывести модели по id производителя. Но, выводит не совсем то.

Код в приложении. Помогите, пожалуйста_) А то не первый день бьюсь, видно замылились мысли.

models.py

from django.db import models
class model(models.Model):
name = models.CharField(max_length=50)
# manufacturers = models.ManyToManyField(manufacturer, through='replication')
def __unicode__(self):
return u'%s' % self.name
class replication(models.Model):
model = models.ForeignKey(model, db_column='model_id')
# manufacturer = models.ForeignKey(manufacturer, db_column='manufacturer_id')
year = models.CharField(max_length=50, db_column='year')
name = models.CharField(max_length=50, db_column='model_id')
# def __unicode__(self):
# return u'%s' % self.name
def __unicode__(self):
return u'%s' % self.name
class manufacturer(models.Model):
name = models.CharField(max_length=50)
model = models.ForeignKey(replication, db_column='id')
# model = models.ForeignKey(model)
def __unicode__(self):
return u'%s' % self.name
from django.contrib import admin
admin.site.register(manufacturer)
admin.site.register(model)
admin.site.register(replication)


views.py


[code python]from tab.models import replication
from django.http import HttpResponse
from django.template import Context, loader
from tab.models import manufacturer

def index(request):
entries = manufacturer.objects.all()
template = loader.get_template('tab/index.html')
context = Context({'entries': entries})
return HttpResponse(template.render(context))

def details(request, id):
entries = manufacturer.objects.get(pk=model)
template = loader.get_template('tab/details.html')
context = Context({'entries': entries})
return HttpResponse(template.render(context))[/code]

details.html

[code python]<html>
<head>
<title>{{ entry.name }}</title>
</head>
<body>

<h1>{{ entry.name }}</h1>
<ul>
{% for entry in entries %}
<li>
<i>{{ entry.id }},{{ entry.name }}</i> -
{{ entry.model }}
</li>
{% endfor %}
</ul>
</body>
</html>[/code]

index.html

[code html]<html>
<head>
<title>Список</title>
</head>
<body>
<ul>
{% for entry in entries %}
<li>
<i>{{ entry.id }}</i> -
<a href='/tab/details/{{ entry.pk }}/'>{{ entry.name }}</a>
</li>
{% endfor %}
</ul>
</body>
</html>[/code]
alexsis
В views.details попробуйте изменить запрос
entries = manufacturer.objects.filter(model=id)
Wojaovlad
alexsis
В views.details попробуйте изменить запрос

Изменил. Но к сожалению он выводит только одну запись.
alexsis
entries =replication.objects.filter(model=id)
Wojaovlad
alexsis

Тоже не прокатило. Он выводит модель, id которой равен id производителя. Т.е. не сравнивает по таблице, почему-то(
scopichol
Правильная модель
class model(models.Model):
  name = models.CharField(max_length=50)
  manufacturers = models.ManyToManyField(manufacturer, through='replication')
И никакой связи многие ко многим сдесь нет. Нету у Alfa Romeo модели A4 и быть не может. Возможно только случайное совпадение названия
И в detail_manufacturer тогда
entries = model.objects.filter(manufacturers=id)
А в detail_model тогда
entries = replication.objects.filter(model=id)
Wojaovlad
scopichol
Правильная модель
Связь многие ко многим организована в БД, через дополнительную таблицу (replication).
Сделал как вы написали, но вот наткнулся на одну проблемму, раньше тоде всплывала, пишет ошибку что manufacturer не определён, т.е. он его не видит.
NameError: name 'manufacturer' is not defined

Помогает перестановка класса manufacturer перед классом model. Можно как-то побороть?

Модели a4 конечно нет у Alfa Romeo, я просто пример моделей приводил_)
scopichol
Wojaovlad
Связь многие ко многим организована в БД, через дополнительную таблицу (replication).
Какой смысл у этой связи?
Судя по полям это может быть просто поле year в model и уникальный ключ по 2м полям название и год
А сам класс replication весьма странный
И многие ко многим закоментировано и 2 разнотипных поля ссылаются на одно и то же поле БД

Помогает перестановка класса manufacturer перед классом model. Можно как-то побороть?
И зачем это бороть. Это логично что manufacturer обьявлен раньше чем model.
Wojaovlad
scopichol

Я бы сделал другую структуру БД, но смсл в том, чтобы уже с готовой работать.

Буду благодарен если подтолкнте где и как будет правильнее решить задачу.
scopichol
Куда еще подталкивать? Я вроде все написал
ТОлько что заметил опечатку. Многие ко многим не нужно
  manufacturer = models.ForeignKey(manufacturer)
Нормальна структура, по крайней мере для озвученной задачи.
И replication явно лишня
А в detail можно сделать так
item =  manufacturers.objects.filter(pk=id)
entries = item.model_set.all()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB