Связывание внешнего ключа между таблицами в моделях django - PullRequest
2 голосов
/ 04 мая 2020

Я только начинаю с Django, поэтому, пожалуйста, помогите мне с моими сомнениями. В настоящее время у меня есть три таблицы Topi c, веб-страница и AccessRecord. В третьей таблице AccessRecord я использовал ForeignKey со второй таблицей Webpage . Но таблица веб-страницы имеет три атрибута topi c, name и URL .. поэтому я сомневаюсь, какой из этих трех атрибутов будет обрабатываться как внешний ключ для AccessRecord таблицы. Любая помощь будет принята с благодарностью.

class Topic(models.Model):

    top_name = models.CharField(max_length=264,unique = True)

    def __str__(self):

        return(self.top_name)

class Webpage(models.Model):

    topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
    name = models.CharField(max_length=264,unique=True)
    url = models.URLField(unique=True)

    def __str__(self):

        return self.name

class AccessRecord(models.Model):

    name = models.ForeignKey(Webpage,on_delete=models.CASCADE)
    date = models.DateField()

    def __str__(self):
        return str(self.date)

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Истина - это отношение внешнего ключа.

Топи c - (1 ------ много) -> веб-страница - (1 ---------- --many) -> Accessrecord

В этой ситуации Accessrecord также связан с Topi c через веб-страницу. Django также автоматически создаст для вас первичный ключ. Я также заметил кое-что интригующее во время игры с Django ORM. Обратите внимание, что то, что вы устанавливаете в def str : метод - это то, чем будет заполнено поле внешнего ключа. т. е. веб-страница вашей модели возвращает self.name, имя поля из унаследованной модели Accsessrecord будет иметь параметры из self.name. Его нельзя заполнить вручную, таким образом Django поддерживает целостность данных.

Вы также можете поэкспериментировать с ним на своей странице администратора.

Надеюсь, это также помогает

1 голос
/ 04 мая 2020

На самом деле отношение ForeignKey - от AccessRecord до Webpage объекта, который находится только в AccessRecord. Не существует прямой связи между Webpage и AccessRecord объектом . Вместо этого django предоставляет reverse relationship, где вы можете получить доступ к queryset из AccessRecord из Webpage объекта. Например:

webpage = Webpage.objects.first()  # an object
records = webpage.accessrecord_set.all() # a queryset

Если вы перебираете указанную выше переменную records, вы получите объект AccessRecord. Как это:

for record in records:
    print(record) # an AccessRecord object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...