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するという寸法。
そんなメモ。まあたいがいにおいてメモった時点で覚えるので意味が無いのかもしれないがまあ。

広告を非表示にする