matobaの備忘録

育児しながら働くあるエンジニアの記録

unittest.mockの深い階層で迷う話

unittestのmockオブジェクトを使うときにいつも迷うのでメモ。

特に、深い階層にある何かをモックしようとすると、僕は今何をしてるんだろう、、、みたいな状況になったりする。

return_valueとかside_effectとかが混乱に原因になっているように思う。

続きを読む

djangoは管理コマンドを追加できるという話

今の会社で働き始める前、djangoで管理コマンドを作れることをぼくは知らなかった。

今は、普通にdjangoで作られたアプリケーションを触るし、普通に管理コマンドが作れることは知ってるし、普通に作る。

だけど、入社する前にdjangoチュートリアルをやってただけだと、全然知らなかった。

多分、ぼくと同じような人は、結構世の中にいるような気がするので、簡単に紹介しよう。

ドキュメントは、ここをみると良いと思う。

カスタム django-admin コマンドの実装 | Django documentation | Django

ドキュメントを読んだた書いてあるけど、

myproject/myapp/management/commands/my_custom_command.py

みたいな場所に作る。なぜ、こんなに階層が深いのかなぞだと思ってる。

こんなファイルが、 my_custom_command.py だとする。

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
          print('hello command')

これで、myappがINSTALLED_APPに入っていたら、my_custom_commndが使えるようになる。

$ python manage.py my_custom_commnd
hello command

パラメータとかも渡せる。詳しくはドキュメントを読むと良さそう。

django adminの一覧でカラムを増やしたい

django adminの一覧でカラムを増やしたい、と思う時はよくある

なんか、毎回同じようなことを検索して、djangoのドキュメントを探して自分で実行して確かめてる。というわけで、メモする。

例えば、こういうモデルがある。

class MyModel(models.Model):
    title = models.CharField(max_length=10)
    text = models.CharField(max_length=10)
    rank = models.IntegerField()

    def __str__(self):
        return self.title

そこに、以下のようなadmin定義をする。

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'text', 'rank')

するとMyModelの一覧は、titleがずらっと並ぶ。rankも見たいよね。という時はある。 そういう時は、list_desplayを定義する。

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'text', 'rank')
    list_display = ('title', 'rank')

それだけ。

詳しくはドキュメントを。

The Django admin site | Django documentation | Django

djangoでadmin画面を触ってる時に出る `Unknown field(s) ...`のエラー

djangoを触っていて、エラーが出た。

Djangoのバージョンは、1.11 以下が、エラーメッセージ。

Unknown field(s) (myfiled) specified for MyModel. Check fields/fieldsets/exclude attributes of class MyModelAdmin.

myfiledとかMyModelAdminとかは、良い感じに目で置換してもらいたい。

admin画面に登録した後に、django adminで詳細ページを開こうとした時に出るエラー。

原因は、filedsのタイポだった。

例えば、django adminに登録する時、以下のようなコードがある。

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'text')

それを、例えば、以下のように書いていて、

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('myfiled', 'text')

myfiledなんてフィールドがmodelに定義されてなかったら、先頭のエラーが出る。