Найти - Пользователи
Полная версия: ForeignKey: почему в отображении модели в БД нет REFERENCES ?
Начало » Django » ForeignKey: почему в отображении модели в БД нет REFERENCES ?
1 2
petrоvich
Читаю книгу “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)?
playpauseandstop
извините, а это настолько важно?

а во-вторых, к примеру в MySQL REFERENCES проставляются после создания таблиц запросом ALTER TABLE…
petrоvich
playpauseandstop
а это настолько важно?
Насколько важна ссылочная целостность?

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


Или это предложение самому после сделать альтеры таблиц?
Александр Кошелев
petrоvich
Если бы внешние ключи вводились альтерами в скрипте выводимом по запросу:
собственно так и есть
petrоvich
Хорошо, пусть я подслеповат, староват и не все вижу в выдаваемом скрипте. :)

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

>>> 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 (кроме как потестировать она ни на что не нужна, вот и не стали заморачиваться)?
Александр Кошелев
petrоvich
Т.е. ссылка на пользователя у объекта класса models.Bookmark есть, на link нет.
А вы её туда сохранили? Судя по
petrоvich
DoesNotExist: Link matching query does not exist.
нет. Так чего удивляться?
petrоvich
Daevaorn
petrоvich
Т.е. ссылка на пользователя у объекта класса models.Bookmark есть, на link нет.
А вы её туда сохранили?
Как сохранить?

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

class Bookmark(models.Model):
title = models.CharField(max_length=200)
link = models.ForeignKey(Link)
user = models.ForeignKey(User)
Что еще нужно указать и где?
Александр Кошелев
Посмотрите документацию:
http://www.djangoproject.com/documentation/db-api/#related-objects
http://www.djangoproject.com/documentation/models/many_to_one/
petrоvich
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 у меня нет?

Покажи на пальцах, что мне нужно добавить в код. Я не вижу.
Александр Кошелев
Вы бы показали, как у вы объект bookmark создаете.
В документации явно указано
petrоvich
a = Article(id=None, headline=“This is a test”, pub_date=datetime(2005, 7, 27), reporter=r)
т.е. поле reporter проинициализировано. У вас же в коде скорей всего ссылка на link пустая.
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