DjangoのModels.pyでfilterとgetを組み合わせる
あるurlでありかつあるuserであるインスタンスをとってきたかった
models.pyはこんな感じ
class Url(models.Model): url = models.CharField(u"url", max_length=1024) title = models.CharField(u"title", max_length=1024) user = models.CharField(u"ユーザー", max_length=128) count = models.IntegerField(u"回数", default=1) ctime = models.DateTimeField(u'登録日時',auto_now_add=True, editable=False) def __unicode__(self): return self.url class Meta: db_table = 'Url' @classmethod def post_url(cls, url, user, title=None): deny_local_address(url) #もしある特定のURLでかつUserのインスタンスがない場合、新規に作成する if not cls.objects.filter(url=url).filter(user=user).count(): if not title: title = get_url_title(url) if not title: return url_instance = Url(url=url, title=title, user=user, ) #ある特定のURLかつUserのインスタンスがある場合、そのインスタンスのcountを+1する else: url_instance = cls.objects.filter(url=url).get(user=user) url_instance.count += 1 url_instance.save()
具体的に言えばあるパーマリンクにたいして
filterでクエリセットとってきてgetでインスタンスをとってくるという発想がなかったのでハマってた。単純に最初からgetでとってくると1つしか該当しない場合ちゃんととってきてくれるが、複数該当してしまうとエラーになる。だから一度filterで絞り込んでからuserでgetするという寸法。
そんなメモ。まあたいがいにおいてメモった時点で覚えるので意味が無いのかもしれないがまあ。