У вас слишком много вопросов в одном ВОПРОСЕ
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 имени в модели через запятую, на сколько я помню по синтаксису
Советую пройти туториал на официальном сайте (англ.) джанго