Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2014 13:21:22

Wojaovlad
От: Минск
Зарегистрирован: 2014-04-16
Сообщения: 12
Репутация: +  0  -
Профиль   Адрес электронной почты  

Django + mysql + связь многое ко многим + вывод значений

Помогите. Делаю на 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]

Отредактировано Wojaovlad (Ноя. 4, 2014 13:22:05)

Офлайн

#2 Ноя. 4, 2014 20:53:32

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Django + mysql + связь многое ко многим + вывод значений

В views.details попробуйте изменить запрос

entries = manufacturer.objects.filter(model=id)

Офлайн

#3 Ноя. 4, 2014 21:36:51

Wojaovlad
От: Минск
Зарегистрирован: 2014-04-16
Сообщения: 12
Репутация: +  0  -
Профиль   Адрес электронной почты  

Django + mysql + связь многое ко многим + вывод значений

alexsis
В views.details попробуйте изменить запрос

Изменил. Но к сожалению он выводит только одну запись.

Офлайн

#4 Ноя. 5, 2014 09:11:04

alexsis
Зарегистрирован: 2013-07-26
Сообщения: 148
Репутация: +  9  -
Профиль   Отправить e-mail  

Django + mysql + связь многое ко многим + вывод значений

entries =replication.objects.filter(model=id)

Офлайн

#5 Ноя. 5, 2014 12:48:01

Wojaovlad
От: Минск
Зарегистрирован: 2014-04-16
Сообщения: 12
Репутация: +  0  -
Профиль   Адрес электронной почты  

Django + mysql + связь многое ко многим + вывод значений

alexsis

Тоже не прокатило. Он выводит модель, id которой равен id производителя. Т.е. не сравнивает по таблице, почему-то(

Офлайн

#6 Ноя. 5, 2014 13:01:49

scopichol
Зарегистрирован: 2014-08-04
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Django + mysql + связь многое ко многим + вывод значений

Правильная модель

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)

Офлайн

#7 Ноя. 5, 2014 13:24:12

Wojaovlad
От: Минск
Зарегистрирован: 2014-04-16
Сообщения: 12
Репутация: +  0  -
Профиль   Адрес электронной почты  

Django + mysql + связь многое ко многим + вывод значений

scopichol
Правильная модель
Связь многие ко многим организована в БД, через дополнительную таблицу (replication).
Сделал как вы написали, но вот наткнулся на одну проблемму, раньше тоде всплывала, пишет ошибку что manufacturer не определён, т.е. он его не видит.
NameError: name 'manufacturer' is not defined

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

Модели a4 конечно нет у Alfa Romeo, я просто пример моделей приводил_)

Офлайн

#8 Ноя. 5, 2014 13:58:54

scopichol
Зарегистрирован: 2014-08-04
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Django + mysql + связь многое ко многим + вывод значений

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

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

Офлайн

#9 Ноя. 5, 2014 14:09:01

Wojaovlad
От: Минск
Зарегистрирован: 2014-04-16
Сообщения: 12
Репутация: +  0  -
Профиль   Адрес электронной почты  

Django + mysql + связь многое ко многим + вывод значений

scopichol

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

Буду благодарен если подтолкнте где и как будет правильнее решить задачу.

Офлайн

#10 Ноя. 5, 2014 16:34:56

scopichol
Зарегистрирован: 2014-08-04
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Django + mysql + связь многое ко многим + вывод значений

Куда еще подталкивать? Я вроде все написал
ТОлько что заметил опечатку. Многие ко многим не нужно

  manufacturer = models.ForeignKey(manufacturer)
Нормальна структура, по крайней мере для озвученной задачи.
И replication явно лишня
А в detail можно сделать так
item =  manufacturers.objects.filter(pk=id)
entries = item.model_set.all()

Отредактировано scopichol (Ноя. 5, 2014 17:08:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version