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

このエントリーをはてなブックマークに追加