1

Я действительно очень смущен тем, как django обрабатывает отношения с базой данных.Django one-to many

Первоначально у меня была модель статьи, содержащая простой IntegerField для article_views, в последнее время я пытаюсь расширить определение article_view, чтобы содержать его собственные поля, поэтому я создал для него модель. (IP, SESSION KEY и т. Д.)

Я немного потерял отношение к тому, как сделать отношения, для меня имеет смысл иметь поле «один-ко-многим» внутри модели статьи, потому что статья может иметь много разных представлений, но представление может быть только частью одной статьи.

все реализации, которые я вижу, имеют эту настройку в действительно странном обратном порядке, что дает?

+0

Можете ли вы показать нам свой код модели? Я думаю, что вы хотите создать отношение как поле foreignkey к «Article» в модели «ArticleView». Это создаст отношение «один ко многим» к статье. Вам не нужно определять поле или атрибут в самой модели статьи. –

+0

То, что я сделал, просто казалось странным и противоречивым, что поле, определяющее количество просмотров моей статьи, на самом деле не внутри моей статьи, подумал, может быть, я чего-то не хватает, но я думаю, что нет. До тех пор, пока мои статьи не были объектами IntegerField внутри модели статьи, я мог легко показать представления в шаблоне, отсортировать по количеству просмотров в панели администратора и т. Д. Теперь я не совсем уверен, как все это. – davegri

+0

Вы можете создать свойство в статье, которое называется 'article_views', и вычисляет это число по требованию. Если вы разместите свой код модели, кто-то, вероятно, покажет вам, как это сделать. При доступе к этому свойству в шаблонах не имеет значения, является ли это модулем или методом. Но вы можете использовать некоторые трюки, чтобы избежать медленных и ненужных запросов к базе данных, если вам нужно очень часто обращаться к 'article_views'. –

ответ

3

К сожалению, Django не имеет поля «один-ко-многим». Это достигается путем создания ForeignKey в этом случае модели ArticleView. Если вы хотите легко получить доступ к просмотрам статей в своем шаблоне, вы можете установить related_name на ForeignKey.

class Article(models.Model): 
    # Article definition 

class ArticleView(models.Model): 
    article = models.ForeignKey(Article, related_name='views') 

В шаблоне теперь вы можете использовать, чтобы получить article.views.count() количество просмотров связанных с учетной записью.

Обратите внимание: это создает запрос базы данных для каждого подсчета, который вы хотите. Вероятно, было бы лучше иметь запрос с аннотатом: Article.objects.annotate(num_views=Count('views'))

+0

спасибо за отличное объяснение! какой-либо шанс для пояснения того, что здесь делает аннотация? – davegri

+0

Возможно, это лучше, если вы прочитали [документацию] (https://docs.djangoproject.com/en/1.8/topics/db/aggregation/#generating-aggregates-for-each-item-in-a-queryset) , В основном это добавляет выражение 'COUNT()' и 'JOIN' в ваш SQL-запрос – jgadelange