Django python rest frameworkでカラムのunique対応をする方法
花の種類を示すflowerCategoryとflowerの名前は登録するときに重複しないようにすべきですが、
現状だと、重複しても登録できてしまうので、カラムのunique化をしたいと思います。
newFlowers/models.pyに以下のように書き込みます。
class FlowerCategory(models.Model):
# unique=Trueを追加
name = models.CharField(max_length=250,unique=True)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
class Flower(models.Model):
# unique=Trueを追加
name = models.CharField(max_length=250,unique=True)
flower_category = models.ForeignKey(
FlowerCategory,
related_name='flowers',
on_delete=models.CASCADE)
production_date = models.DateTimeField()
has_it_competed = models.BooleanField(default=False)
inserted_timestamp = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
models.CharFieldイニシャライザにunique=Trueを追加しただけです。
モデルクラスに制約を加えたので、以下のようにmigrationを実行しましょう
python manage.py makemigrations newFlowers
コマンドを実行すると、以下のように出力されます。
Migrations for 'newFlowers':
newFlowers/migrations/0002_auto_20180715_0651.py
- Alter field name on flower
- Alter field name on flowercategory
migrationファイルを作ったので、migrateを実行しましょう
python manage.py migrate
uniqueの確認をする
FlowerCategoryとFlowerの名前のunique化が適応されたか確認してみます。
以前作ったFlowerCategory・Flowerの名前で追加するapiを叩いてみます。
curl -iX POST -H "Content-Type: application/json" -d '{"name":"Liliaceae"}' localhost:8000/flower-categories/
HTTP/1.1 400 Bad Request
Date: Sun, 15 Jul 2018 07:00:43 GMT
Server: WSGIServer/0.2 CPython/3.6.4
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 59
{"name":["flower category with this name already exists."]}
curl -iX POST -H "Content-Type: application/json" -d '{"name":"newLily", "flower_category":"Liliaceae", "production_date": "2018-07-20T02:02:00.716312Z", "has_it_competed": "false"}' localhost:8000/flowers/
HTTP/1.1 400 Bad Request
Date: Sun, 15 Jul 2018 07:02:15 GMT
Server: WSGIServer/0.2 CPython/3.6.4
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 50
{"name":["flower with this name already exists."]}
uniqueなnameでないとapiが受け付けないようにすることができました。
こちらを参考に、知識をまとめています。
初版:2018/7/15