Доступ к данным из другой таблицы - Внешний ключ в Django Rest Api - Неизвестный столбец - PullRequest
0 голосов
/ 14 декабря 2018

Я создал Django Rest Models из существующей базы данных MySQL с помощью inspectdb.У меня есть две модели, и я хочу получить доступ к некоторым данным из другой модели.

Мои модели:

class Impreza(models.Model):
    year = models.IntegerField()
    tytul = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = '2006_impreza'

class Description(models.Model):
    year = models.IntegerField()
    year_id = models.IntegerField()
    id_imprezy = models.IntegerField(blank=True, primary_key=True)

    class Meta:
            managed = False
            db_table = '2006_description'

Мой сериализатор:

class ImprezaSerializer(serializers.ModelSerializer):
    desc = serializers.StringRelatedField(many=True)

    class Meta:
        model = Impreza
        fields = ('year', 'tytul', 'desc')

Моя проблема в том, чтоDjango ищет идентификатор с именем «impreza_id», но существует с другим именем - «id_imprezy».Как вы можете видеть, я попытался дать id_imprezy значение primary_key = True, чтобы сообщить Django, что это правильное имя, но оно не работает.Это все еще дает мне ошибку: (1054, "Неизвестный столбец '2006_description.impreza_id' в 'списке полей'") .

В моей базе данных обе таблицы имеют идентификатор, но это не отображается в модели.Я читал, что Django не показывает столбцы идентификаторов в моделях.

Как я могу сделать это правильно?Как добавить внешний ключ?Извините, но я действительно новичок в Джанго; -)

1 Ответ

0 голосов
/ 14 декабря 2018

В вашем сериализаторе вы ссылаетесь на model = Impreza:

...
class Meta:
    model = Impreza
    fields = ('year', 'tytul', 'desc')

Вы ссылаетесь на класс Impreza, который на самом деле имеет поля 'year' и 'tytul'.Класс Impreza также содержит переменную с именем impreza_id.Поскольку ваш сериализатор ищет элементы в Impreza, а не Description, Django помечается галочкой и сообщает, что не может найти impreza_id.

Изменение класса, на который вы ссылаетесь, не решит вашпроблема, хотя.Если вы хотите иметь отношение один ко многим, вы будете использовать ForeignKey.

class Description(models.Model):
    year = models.IntegerField()
    impreza = models.ForeignKey(Impreza, on_delete=models.CASCADE)

Все эти вещи говорят, Я бы рассмотрел другую архитектурув целом.Вы создаете очень специфический класс, который вполне может быть модульным и многоразовым.Подумайте только о том, чтобы сделать это:

class Vehicle(models.Model):
    year = models.PositiveSmallIntegerField()
    make = models.CharField(max_length=64)
    model = models.CharField(max_length=64)
    description = models.CharField(max_length=1024)

Надежный вариант использования отношений «один ко многим»:

class Owner(models.Model):
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)
    age = models.PositiveSmallIntegerField()

class Vehicle(models.Model):
    owner = models.ForeignKey(Owner, on_delete=models.CASCADE)
    year = models.PositiveSmallIntegerField()
    make = models.CharField(max_length=64)
    model = models.CharField(max_length=64)
    description = models.CharField(max_length=1024)

В этом случае у одного владельца может быть много транспортных средств.

Ура!

...