Почему Djano ORM не работает с простым отношением внешнего ключа? - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь просто создать one to many модель отношений категорий, используя Django amazing ORM.

SQL:

create table categories(
    id serial   primary key not null,
    parent_id   int
);
insert into categories values(default,default,default);
update categories set parent_id = 1 where id > 1;

select * from categories;
 id | parent_id
----+-----------
  2 |         1
  3 |         1
  1 |
(3 rows)

Модель Django amazing orm:

class Categories(models.Model):
    id = models.AutoField(primary_key=True)
    parent_id = models.ForeignKey('self')
    class Meta:
        managed = False
        db_table = 'categories'

Запрос Django:

Categories.objects.get(id=1)

ВЫХОД:

django.db.utils.ProgrammingError: column categories.parent_id_id does not exist
LINE 1: SELECT "categories"."id", "categories"."parent_id_id" FROM "...
                                  ^
HINT:  Perhaps you meant to reference the column "categories.parent_id".

Почему он использует столбец parent_id_id вместо parent_id и как я могу заставить его использовать parent_id?

РЕДАКТИРОВАТЬ

Я только что изменил поле parent_id на parent.

EDIT 2

Ответ tatlar не в моем случае, потому что у меня уже есть схема базы данных.

Итак, после более глубокого изучения документации и других вопросов, связанных со стековым потоком, я получил в результате.Эта модель содержит ссылку на родительские и дочерние категории для каждой строки.Он может быть унаследован для всех моделей данных, аналогичных графу (комментарии, категории и т. Д.).

class Categories(models.Model):
    id = models.AutoField(primary_key=True)
    parent = models.ForeignKey('self', on_delete=None, parent_link=True, related_name='children')
    class Meta:
        managed = False
        db_table = 'categories'

Получить всех детей для категории 1:

from myapp.models import Categories

ch = Categories.objects.get(id=1).children print (ch)
# <QuerySet [<Categories: Categories object (2)>, <Categories: Categories object (3)>]>

Получить родительских элементов для категории 2:

from myapp.models import Categories

ch = Categories.objects.get(id=1).parent
print (ch)
# <Categories: Categories object (1)>

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Татлар ответ не в моем случае, потому что у меня уже есть схема базы данных.

Так что после более глубокого изучения документации и других вопросов о стекаповороте, у меня есть результат.model содержит ссылку на категории parent и children для каждой строки.Он может быть унаследован для всех моделей данных, подобных графику (комментарии, категории и т. Д.).

class Categories(models.Model):
    id = models.AutoField(primary_key=True)
    parent = models.ForeignKey('self', on_delete=None, parent_link=True, related_name='children')
    class Meta:
        managed = False
        db_table = 'categories'

Получить всех дочерних элементов для категории 1:

from myapp.models import Categories

ch = Categories.objects.get(id=1).children
print (ch)
# <QuerySet [<Categories: Categories object (2)>, <Categories: Categories object (3)>]>

Получить родительских для категории 2:

from myapp.models import Categories

ch = Categories.objects.get(id=1).parent
print (ch)
# <Categories: Categories object (1)>
0 голосов
/ 26 мая 2018

Жаль слышать, что у вас проблемы с Джанго.Со временем вы можете полюбить Django ORM и то, как он абстрагирует весь код SQL для вас:)

Вам нужно немного глубже понять, как работает ORM - это не замена 1: 1 дляКод SQL Ознакомьтесь с документами по модели.

В вашем конкретном случае вам нужно создать новый класс с именем Parent и ссылаться на этот класс (через ForeignKey) из вашего Categoriesclass (вы также можете переименовать ваш класс Categories в Category - ORM также обрабатывает множественное число).

Попробуйте код ниже (где я уже переименовал Categories в Category дляВы):

from django.db import models

class Category(models.Model):
    id = models.AutoField(primary_key=True)
    parent = models.ForeignKey(Parent)
    # ... Extra model attributes

    class Meta:
        verbose_name_plural = "categories"


class Parent(models.Model):
    id = models.AutoField(primary_key=True)
    # ... Extra model attributes

Затем добавьте все дополнительные атрибуты, которые вам нужны.Это создаст все таблицы базы данных и их взаимосвязи без необходимости написания SQL.Если вы привыкли писать SQL, то - это изменение, но это имеет смысл, поскольку вы больше работаете с ORM и понимаете, насколько он хорош.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...