@zxcv0in

Создается ли self.id для каждого объекта модели по умолчанию? Как работает args в reverse()?

Может быть вопрос покажется глупым, но я что-то туплю. Рыскал в документации и, не поверите, гуглил, но так и не нашел внятного ответа на эти два вопроса. А теперь к конкретике:
def get_absolute_url(self):
return reverse("book-detail", args = [str(self.id)])
Во-первых, переменная id в классе не определена, а значит она либо определилась по умолчанию, о чем, собственно, и вопрос, либо определяется позже в обучении(я пока учусь, так что, может, далее и будет ответ на этот вопрос).Создается ли self.id для каждого экземпляра модели по умолчанию?
Во-вторых за что отвечает args в reverse()?
И еще, если не сложно, можете объяснить эту конструкцию:
', '.join([ genre.name for genre in self.genre.all()[:3] ])
Я конкретно не понимаю зачем здесь genre.name и к чему здесь обращение идет, если класс есть только "Genre", а не "genre"(да, в модели "Book" есть параметр "genre", который уже обращается к конкретному классу "Genre", у которого определен параметр "name", но можно ли так обращаться и будет ли разница если просто поставить "Genre.name" вместо "genre.name" в данном случае?
Код:
class Genre(models.Model):
name = models.CharField(max_length = 200, help_text = "chose a genre of the book")

class Meta:
ordering = ["name"]
def __str__(self):
return self.name

from django.urls import reverse

class Book(models.Model):
title = models.CharField(max_length = 1000)
genre = models.ManyToManyField(Genre, help_text = "choose a genre for the book")
author = models.ForeignKey("Author", on_delete = models.SET_NULL, null = True)
summary = models.TextField(max_length=1000, help_text="Enter a brief description of the book")

def __str__(self):
return self.title

def display_genre(self):
return ', '.join([ genre.name for genre in self.genre.all()[:3] ])
display_genre.short_description = 'Genre'

def get_absolute_url(self):
return reverse("book-detail", args = [str(self.id)])
  • Вопрос задан
  • 204 просмотра
Решения вопроса 1
@maksam07
У вас слишком много вопросов в одном ВОПРОСЕ
1. id ставится по умолчанию, если явно не задан другой первичный ключ. pk и id в модели, где не задан явно первичный ключ будут ссылаться на одно и то же поле, но если вдруг первичным ключем вы сделаете id_customname, то pk будет ссылаться на него. То есть pk - универсальное свойство, которое ищет первичный ключ у модели, но работает немного медленнее, чем если бы вы прописывали id во время обращения к строке.
2. args подставляет, собственно, аргументы, в юрл book-detail, но лично я предпочитаю другой вариант:
return reverse('book-detail', kwargs={'id': self.id})

То есть, у вас есть (я так понимаю проходитет туториал от мозиллы):
url(r'^book/(?P<pk>\d+)$', views.BookDetailView.as_view(), name='book-detail'),

И ссылка станет: book/1
3.
', '.join([ genre.name for genre in self.genre.all()[:3] ])
Перечисляет первые 3 имени в модели через запятую, на сколько я помню по синтаксису

Советую пройти туториал на официальном сайте (англ.) джанго
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы