モデルで、Primary Key を使うようにした時の ForeignKey の使い方です。
- models.py
to_field を指定する必要があります。
models.py
from django.db import models
from django.urls import reverse
class Member(models.Model):
id_member = models.CharField(max_length=10,primary_key=True)
name = models.CharField(max_length=20)
year_of_birth = models.IntegerField(null=True)
team = models.ForeignKey('Team', to_field='id_team', on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('member-detail', args=[str(self.id_member)])
class Team(models.Model):
id_team = models.CharField(max_length=10,primary_key=True)
name = models.CharField(max_length=20)
home = models.CharField(max_length=20)
def get_absolute_url(self):
return reverse('team-detail', args=[str(self.id_team)])
def __str__(self):
return f'{self.name}'
- urls.py
Primary Key を 文字列にしたので、
slug:pk にする必要があります。
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('members/', views.MemberListView.as_view(), name='members'),
path('member/<slug:pk>', views.MemberDetailView.as_view(), name='member-detail'),
path('teams/', views.TeamListView.as_view(), name='teams'),
path('team/<slug:pk>', views.TeamDetailView.as_view(), name='team-detail'),
]
#
urlpatterns += [
path('member/create/', views.MemberCreate.as_view(), name='member_create'),
path('member/<slug:pk>/update/', views.MemberUpdate.as_view(), name='member_update'),
path('member/<slug:pk>/delete/', views.MemberDelete.as_view(), name='member_delete'),
]
#
- データベースのテーブルは次のようになります。
member
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| id_member | varchar(10) | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| year_of_birth | int(11) | YES | | NULL | |
| team_id | varchar(10) | YES | MUL | NULL | |
+---------------+-------------+------+-----+---------+-------+
team
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id_team | varchar(10) | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| home | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
- 次の環境で確認しました。
$ python --version
Python 3.7.2
$ python -m django --version
2.1.7