Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » ForeignKey: почему в отображении модели в БД нет REFERENCES ? [RSS Feed]

#1 Май 7, 2008 11:47:09

petrоvich
От:
Зарегистрирован: 2008-05-07
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

Читаю книгу “Learning Website Development with Django”. В качестве примера приводится следующая модель:

from django.db import models
from django.contrib.auth.models import User

class Link(models.Model):
url = models.URLField(unique=True)

class Bookmark(models.Model):
title = models.CharField(max_length=200)
link = models.ForeignKey(Link)
user = models.ForeignKey(User)
Смотрю отображение модели в sql (в качестве базы используется sqllite):

CREATE TABLE "bookmarks_bookmark" (
"id" integer NOT NULL PRIMARY KEY,
"title" varchar(200) NOT NULL,
"link_id" integer NOT NULL,
"user_id" integer NOT NULL REFERENCES "auth_user" ("id")
);


Почему link_id не отображается как внешний ключ (версия Django - trunc)?



Отредактировано (Май 7, 2008 11:54:06)

Офлайн

#2 Май 7, 2008 13:11:55

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

извините, а это настолько важно?

а во-вторых, к примеру в MySQL REFERENCES проставляются после создания таблиц запросом ALTER TABLE…



Офлайн

#3 Май 7, 2008 14:33:20

petrоvich
От:
Зарегистрирован: 2008-05-07
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

playpauseandstop
а это настолько важно?
Насколько важна ссылочная целостность?

playpauseandstop
а во-вторых, к примеру в MySQL REFERENCES проставляются после создания таблиц запросом ALTER TABLE…
Это можно делать практически в любой БД, поддерживающей ANSI SQL, не только в MySQL. Если бы внешние ключи вводились альтерами в скрипте выводимом по запросу:
python manage.py sql bookmarks,
я бы не задавал вопрос.


Или это предложение самому после сделать альтеры таблиц?



Отредактировано (Май 7, 2008 14:34:56)

Офлайн

#4 Май 7, 2008 15:03:14

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

petrоvich
Если бы внешние ключи вводились альтерами в скрипте выводимом по запросу:
собственно так и есть



Офлайн

#5 Май 7, 2008 15:09:34

petrоvich
От:
Зарегистрирован: 2008-05-07
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

Хорошо, пусть я подслеповат, староват и не все вижу в выдаваемом скрипте. :)

Зайдем с другой стороны. В интерактивной панели:

>>> from bookmarks.models import *
>>> bookmark = Bookmark.objects.get(id=1)
>>> bookmark.user
<User: test>
>>> bookmark.link
DoesNotExist: Link matching query does not exist.

Т.е. ссылка на пользователя у объекта bookmark (класса models.Bookmark) есть, на link - нет.

Поле типа ManyToManyField обрабатывается корректно, с внешнего модуля тоже User подбирается, а определяемые в модуле модели (наследники от models.Model) нет.

Попробовал так:
link = models.ForeignKey('Link'),
или к примеру на себя (как в документации):
link = models.ForeignKey('selt')

Результат тот же - внешнего ключа нет. Может проблема в поддежке sqllite (кроме как потестировать она ни на что не нужна, вот и не стали заморачиваться)?



Отредактировано (Май 7, 2008 15:14:39)

Офлайн

#6 Май 7, 2008 15:14:29

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

petrоvich
Т.е. ссылка на пользователя у объекта класса models.Bookmark есть, на link нет.
А вы её туда сохранили? Судя по
petrоvich
DoesNotExist: Link matching query does not exist.
нет. Так чего удивляться?



Офлайн

#7 Май 7, 2008 15:15:30

petrоvich
От:
Зарегистрирован: 2008-05-07
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

Daevaorn
petrоvich
Т.е. ссылка на пользователя у объекта класса models.Bookmark есть, на link нет.
А вы её туда сохранили?
Как сохранить?

Из твоих слов вытекает что такого объвления недостаточно:

class Bookmark(models.Model):
title = models.CharField(max_length=200)
link = models.ForeignKey(Link)
user = models.ForeignKey(User)
Что еще нужно указать и где?



Отредактировано (Май 7, 2008 15:28:33)

Офлайн

#8 Май 7, 2008 15:26:18

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

Офлайн

#9 Май 7, 2008 15:39:40

petrоvich
От:
Зарегистрирован: 2008-05-07
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

Daevaorn
Посмотрите документацию:
http://www.djangoproject.com/documentation/db-api/#related-objects
http://www.djangoproject.com/documentation/models/many_to_one/
Спасибо за ссылки.

По первой читаю, что when you define a relationship in a model (i.e., a ForeignKey, OneToOneField, or ManyToManyField), instances of that model will have a convenient API to access the related object(s) (выделено мной).

Т.е. объявления в виде
link = models.ForeignKey(Link)
будет достаточно? Нет?

По второй смотрю пример,


class Article(models.Model):
headline = models.CharField(max_length=100)
pub_date = models.DateField()
reporter = models.ForeignKey(Reporter)

def __unicode__(self):
return self.headline

class Meta:
ordering = ('headline',)


>>> a = Article(id=None, headline=“This is a test”, pub_date=datetime(2005, 7, 27), reporter=r)

>>> a.reporter
<Reporter: John Smith>




Вопрос, чем объявление
reporter = models.ForeignKey(Reporter)
в этом примере отличается от объявления link в моем вопросе
link = models.ForeignKey(Link)??

И почему a.reporter сработало в примере по ссылке, а bookmark.link у меня нет?

Покажи на пальцах, что мне нужно добавить в код. Я не вижу.



Отредактировано (Май 7, 2008 15:43:40)

Офлайн

#10 Май 7, 2008 15:47:51

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

ForeignKey: почему в отображении модели в БД нет REFERENCES ?

Вы бы показали, как у вы объект bookmark создаете.
В документации явно указано

petrоvich
a = Article(id=None, headline=“This is a test”, pub_date=datetime(2005, 7, 27), reporter=r)
т.е. поле reporter проинициализировано. У вас же в коде скорей всего ссылка на link пустая.



Офлайн

  • Начало
  • » Django
  • » ForeignKey: почему в отображении модели в БД нет REFERENCES ?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version