スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    django ticket#1796(DBリレーション発見できない問題)の解決策?

    0
      djangoのDBリレーションでバグ!?の件、続きです。全然解決策じゃないかも?

      I'm not sure where everyone is on this but I figured it out for me so I thought I'd share:

      The problem is that the get_all_related_many_to_many_objects() caches itself, so if the many-to-many manager gets called before all the apps are loaded, any models in apps added afterwards won't be in that cache. I commented out the line that gets the cache so it has to re-cache each time, and it fixes the problem. Behold:

      def get_all_related_many_to_many_objects(self):
      try: # Try the cache first.
      return self.ham_sandwich
      #return self._all_related_many_to_many_objects
      except AttributeError:
      ...

      Since .ham_sandwich is never found it falls into the AttributeError? exception and re-caches. It then works as planned.

      The permanent fix, it seems to me, is to make it so that when a many-to-many is created, it clears the _all_related_many_to_many_objects of the _meta of the relation class, but I'm not sure exactly where best to do that.


      from other_app.models import Tag

      class Thing(models.Model):
      tag = models.ManyToManyField(Tag)

      del Tag._meta._all_related_many_to_many_objects

      2つの解決策(ハック?)が載っていました。
      開発版(svn)使ってる人で、悩んでいる人は結構いるとみた。

      で、私はというと、generic_viewを放棄し、自前でviews.pyを書いて、カスタムSQL(extra)を使ってます。
      この問題に関して公式アナウンスが出るまで、うっかりsvn up→サイトが死亡という状態は避けたいので。全然美しくないけど!(泣


      def entry(request, object_id):
      object = Entry.objects.get(id=object_id)
      ##tags = object.tags.all()
      tags = Tag.objects.extra(tables = ['myapp_entry_tags'],
      where=['myapp_entry_tags.tag_id = myapp_tag.id ¥
      AND myapp_entry_tags.entry_id=%s'],
      params=[object.id])
      return render_to_response("myapp/entry_detail.html",
      { 'object':object, 'tags':tags },
      context_instance=RequestContext(request))



      djangoの中の人、バグfix待ってます。。。がんばって!


      フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)

      0
        djangoのrequest.POSTの挙動について。
        マニュアルにphpの$_POST変数に影響されてできた機能だと書いてありますが、ちょっと違う点があったので注意。

        <input type="checkbox" name="test" value="hoge" checked="checked" />
        <input type="checkbox" name="test" value="hage" checked="checked" />
        <input type="checkbox" name="test" value="mage" checked="checked" />

        と書いてsubmitすると、request.POST['test']には['hoge','hage','mage'](pythonのリスト)が入るようです。
        確かPHPだと上書きされちゃって一番下のmageだけ出てきたような記憶が。

        今度は

        <input type="checkbox" name="test[]" value="hoge" checked="checked" />
        <input type="checkbox" name="test[]" value="hage" checked="checked" />
        <input type="checkbox" name="test[]" value="mage" checked="checked" />

        と書いてsubmitしてみた。
        request.POSTの中身は…
        request.POST['test[]']に['hoge','hage'.'mage']が入ってました(汗
        PHPだと、自動的に$_POST['test']=array(0=>'hoge',1=>'hage',2=>'mage')みたいになるので、それ自体をループすることができますが、djangoのrequest.POSTではできない模様。
        さて困った。

        更に、

        <input type="checkbox" name="test[0]" value="hoge" checked="checked" />
        <input type="checkbox" name="test[1]" value="hage" checked="checked" />
        <input type="checkbox" name="test[2]" value="mage" checked="checked" />

        と書いてsubmit。
        予想通り(?)、
        request.POST['test[0]']='hoge'
        request.POST['test[1]']='hage'
        request.POST['test[2]']='mage'
        でした。うーん、困った。

        全てのチェックボックスをname="test"にして、viewではfor v in request.POST['test']:で廻すしかないかな?
        #ManyToManyのadminインターフェイスをcheckboxにしてくれ!というticket(とっくにclosed)が本家にあったと思うんだけど、djangoの中の人からの回答は「checkboxは真偽(bool)を表すためのもんだ!文句あっか?!」という感じだった。文化の差なのか…??


        djangoで携帯サイト。(UTF8以外のエンコードでサイト公開)

        0
          クライアントさんから、PC・携帯両方対応を希望されることが多くなってきたので、djangoで携帯サイトを作るテストをしてみました。

          ■前提条件■
          python2.4以上(codec標準装備)であること
          PCサイトは既にUTF8環境で作成済みであること(DB内の日本語データもutf8で入っている)

          ■方法論■
          1.新しくmobile_settings.pyを作り、そこに↓を追加。場所はどこでも良い。
          DEFAULT_CHARSET = 'sjis'

          2.mod_pythonなりCGIなりに渡すdjango_settings_moduleは「myproject.settings」ではなく「myproject.mobile_settings」にする。

          3.テンプレート内の日本語はSJISで書く。

          4.DBから読み出した日本語文字列をテンプレート内で呼び出す時にUTF8→SJISエンコード変換をするフィルタを書く。


          # coding: utf8
          from django import template
          register = template.Library()
          @register.filter()
          def sjis(value):
          return unicode(value,'utf8').encode('sjis')


          ※当方、pythonまだまだ素人レベルなので、間違い・無駄処理があったらご指摘くださいm(_ _)m

          5.{% load hoge %}した上で、テンプレート内のDB読み出し部分は{{ object.body }}ではなく{{ object.body|sjis }}のように記述。

          これでSJISエンコードのサイトが公開できました^^
          携帯からも確認済みです★


          (続き)django DBのリレーションでバグ??2

          0
            本家のticketに挙がってる同じエラー報告を見ていて気づいた。
            同じエラー出してる人は「Tag」を使ってる。
            ManyToManyの使われる局面が圧倒的にCMSの「タグ」なのかもしれないけど、ManyToManyつかっててエラーが出ない人がいるということは、何らかの関係があるような気がしてきた。

            一応、現在特定されているエラーの原因としては、DBのリレーションを取得する部分でキャッシュ制御がうまく行ってないこと??らしいです。
            mtredinnickさんが「ちょっとまとまった時間があるから、あと数日以内?に修正がんばってみるよ!」とおっしゃってるので、それを信頼して待つことにしつつ、「Tag」という名前を使わずにModelから作ってみようかな。urls/views/template既にTagで大量に書いちゃったから激しくめんどくさいけどorz


            django DBのリレーションでバグ??

            0
              エラーの続報です。

              18:30追記
              よく探したら本家にだいぶ前からticketがありました。
              ちょっと読んできます。。


              ■その1
              entryに設定するManyToManyFieldの名前を「tags」と複数形にし、その状態でsyncdbしなおす。
              →変化なし

              ■その2
              Entryモデルのメソッドとしてget_related_tags(self)というのを作り、呼んでみた。
              →変化なし

              ■その3
              DBを一旦空っぽにしてからsyncdbしなおす。
              →変化なし

              ■その4
              entryのオブジェクトを取得するときにselect_related()をつけた
              →変化なし

              どうも、何度やってもentry.tag〜としたときに、Tag.objects.filter(entry__pk=1)のように照合としてエラーを食らうようです??
              でも、このプロジェクトだけ。他のプロジェクトでは正常にManyToManyを呼び出せてます。

              時間が取れたらDB APIコード読みしてみようと思ってますが、django使って構築しようと思ってたあれこれ、考え直さないとだめかも??ーー;


              django…好きなんだけどエラーばっかorz

              0
                現在超ハマリ中。
                多対多リレーションで、manage.py shellではOK(思い通りの表示)なのにテンプレート上に書くとTypeErrorと怒られます。

                tag
                --name
                --prefix

                entry
                --title
                --tag(ManyToMany)
                --body

                という作りのmodelを書いてあって、対応するDBもsyncdbで作ってある。


                で、entry_detailのテンプレートの中で

                このエントリーに関連付けられたタグ:
                {% for tag in object.tag.all %}
                {{ tag.name }}
                {% endfor %}

                と書いてエラーですorz

                shellで


                e=Entry.objects.get(pk=1)
                for tag in e.tag.all():
                tag.name


                とやってOKなのに???

                もしかして私、何か根本的に間違ってます??
                一応djangoはローカルもテスト用サーバーも両方最新svn版です。

                (追記)
                Debug=Trueでのエラーメッセージは
                Caught an exception while rendering: Cannot resolve keyword 'entry' into field. Choices are: id, prefix, name
                です。
                念の為、shellで
                object = Entry.objects.get(id=1)
                tags = Tag.objects.filter(entry=object)
                とやってみましたが、shellではエラーは出ません。
                shellと実際のコードで挙動が違うのは初めてで、正直非常に戸惑ってます。



                FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード

                0
                  apacheのバージョン(2.0.46)が原因でmod_pythonが使えず、FastCGIにチャレンジした訳ですが、結局うまく行かず。。。
                  仕方ないのでapache自体のバージョンアップに賭けてみることにしました。

                  念のため、データを全てバックアップし(DBの分も)、DNSを他の鯖に向けて「メンテ中」表示を出してからスタート。

                  まずapachectl stop。

                  apache2.2系とapache2.0.58〜辺りでもmod_pythonが入らないという話を海外ML・ブログで見かけたので(2006年とかのちょっと古い情報なのでもしかしたら杞憂だったかも。。。)、apacheのアーカイブサイトから2.0.55のソースをダウンロード。

                  「2.0系→2.0系のようなマイナーバージョン同士のアップグレードでは設定の同一性は維持される」というapacheのドキュメントを信じて^^;
                  サーバーを借りたときから入っていたapache2.0.46はRedHatなレイアウト(/var/www/htmlにドキュメントルートがあり、/usr/sbinにapxsやapachectlがあるタイプ)だったので、config.layoutのRedhat部分を確認し、それを使う。

                  tar -zxvf httpd-2.0.55.tar.gz
                  ./configure --enable-so --enable-mods-shared=all --with-layout=RedHat
                  make
                  make install
                  #(あれこれ出したり入れたりしてたので最初からルートで作業してます^^;)

                  あっけなく上書きアップグレード完了。
                  FastCGIで悩む暇があったらもっと早くやればよかった…。

                  httpd.confにLoadModuleの行を入れ、サブドメインだけDNSを戻してapachectl start。
                  正常に起動♪(つまり、LoadModule python_moduleの行でひっかからなかった♪)

                  早速サブドメインを使ってでmod_pythonでの動作を確認。
                  無事、urls.pyで指定した表紙のページが表示された!^^

                  結論から言って、VPS〜専用鯖でroot権限持ってる人はmod_pythonを使ったほうがFastCGIより楽だと思う。テストサイトでOKになったらhttpd.confを書き換えてapache再起動するだけでいいので。
                  #今後、VPS〜専鯖を契約する際はapacheのバージョンにも注意が必要?


                  FastCGIでdjango…400エラー???

                  0
                    自分用のVPSにdjangoをセットアップして、CGI版でやってみると非常〜〜に遅い。(CGI版でもそこそこ速いXREAは偉大だ!)

                    で、せっかくなのでmod_pythonを試そうと思い(ローカルPCでは既に快適にmod_pythonつかってます^^)、mod_pythonをインストール。ここまではOK。
                    が、httpd.confを書き直す(LoadModuleを追加)すると、Apache再起動でエラー。
                    APRのテーブルにないよ!と怒られました。
                    エラーメッセージでググるとapache2.0.46ではmod_python3.2.7以上が使えないらしい。(海外のMLと誰かのブログがhit)
                    とりあえず、同じapacheで既に稼動してるサービスがあるのでapacheのバージョンアップはちょっと難しい。mod_pythonのバージョンを下げてみても、同じエラーが出る。


                    仕方ないのでFastCGIを試すことに。実は、恥ずかしながらFastCGI初体験^^;
                    fastcgiをインストール。OK。
                    mod_fastcgiをインストール。OK。
                    早速djangoをFastCGIで使うをもとに設定してみる。
                    ■httpd.conf

                    AddHandler fastcgi-script .fcgi
                    FastCGIConfig -maxClassProcesses 4 -minProcesses 1
                    FastCgiIpcDir /tmp
                    FastCGIExternalServer /var/www/***/public_html/index.fcgi -host 127.0.0.1:3033


                    ServerName ***.com
                    DocumentRoot /var/www/***/public_html
                    RewriteEngine On
                    RewriteCond %{REQUEST_FILENAME} !-f
                    RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]

                    で、apache再起動。ここまでOK。

                    SSHで入って、manage.py runfcgi method=threaded host=127.0.0.1 port=3033

                    が、この状態でブラウザからアクセスすると、400エラー正しくない要求 と怒られました…。
                    意味不明。
                    apacheのエラーログには何も書いてないし。

                    もう今日はこれ以上やっても無駄だと思うので、明日もう一度考えることにして忘れる。
                    誰か解決法知ってたら教えてください><


                    djangoを自分のVPSにセットアップ♪

                    0
                      今まで手書きPHP製CMSを使ってた自サイト(WEB制作のPRサイトです^^)をdjango製CMSで置き換えるために、自分のVPSにpythonとdjangoをセットアップしました。

                      python&djangoセットアップの際のハマリポイントとしては、
                      ■MySQLdbのインストール
                      MySQLdbを入れようとしたらgccなんちゃらでエラー!
                      なんで?なんで?とgcc自体を最新版にアップしたり、python2.4が入っていたものをpython2.5.1に入れ替えてみたり、思いつく限りの対策をしても、同じところでエラー。
                      tgzじゃなくてsvnでMySQLdbをダウンロードしてみてもダメ。
                      やはり根本的に何かが足りないと思い、エラーメッセージを頼りに英語版のpython MLやforumをあさった結果、何のことは無い、mysql-develを入れてませんでした。
                      mysql-develのインストールは、ソース版が無い??ようなので、初めてRPMを使ってインストール。
                      MySQLのバージョンが5.0.27なので、develのrpmを探すだけで一苦労しました…。


                      ■1つのサーバー内でpythonのバージョン切り替え方法
                      ↑↑の副産物として、私のサーバー内ではpython2.4とpython2.5.1が共存する状態になってしまい、MySQLdbとdjangoはpython2.5.1のほうのsite-packagesに入れました。
                      /usr/bin/python python2.4
                      /usr/local/bin/python python2.5
                      という状態ですが、yum等がpython2.4系を前提に書いてあるとしたら動かなくなるとマズイので、djangoを使う時はフルパスで/usr/local/bin/pythonと書くことにして、解決。


                      ■MySQLdbのconnections.pyがコケる(MySQLに接続できない)問題の解決
                      さて、ようやくローカル環境で作ったdjango製CMSプロジェクトをFTPアップロードし、動作を確認しようとしたら500エラー。
                      MySQLに接続できないらしい。
                      「Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'」
                      こちらを参考に、原因&解決法を考えると…
                      mysqlは/var/mysqlにソースからインストールしたもの。普段使ってるmysql.sockは/tmp/mysql.sockにあります。
                      多分mysql-develだけrpmでインストールしたせいで、sockの位置が誤ってMySQLdbに伝わってるっぽい。
                      my.confをいじって/tmp/mysql.sockから/var/lib/mysql/mysql.sockにsocket位置を変えてしまうことも考えましたが、そうするとPHPのほうも設定を変えないといけなくなる。めんどくさい。
                      そこで、/var/lib/mysql/mysql.sockから/tmp/mysql.sockにシンボリックリンクを貼ってお手軽に解決としました。


                      おまけ。
                      XREA・VPS2つ(2つの違うVPS)にdjangoを入れてみて思ったこと。
                      コードの追加・変更がある間は、mod_pythonではなくCGI版であれこれやってるんですが(XREAは常にCGI版ですが^^;)、微妙にサーバーの仕様が違うのか、apacheの設定が違うのか、はたまたブラウザ側の問題なのか、index.cgiとかdjango.cgiをつけてアクセスできる場合・できない場合がある。
                      XREAに設置したdjango製のページで、電話で話しながら同時に同じ画面を見ているのにも関わらず、私はindex.cgiありのurls.pyじゃないとダメ、相手はindex.cgiなしのurls.pyじゃないとダメ、なんて変なことが起きたりして。
                      面倒でも、CGI版で動かすときはindex.cgiあり/なし両方をurls.pyに併記するのがいいかも。


                      django book和訳やってる人います?

                      0
                        Django Book (English/beta)
                        今月末までにプロジェクト群が落ち着きそうなので、誰もやってなければ私がやってみようかなと思ってるんですが。(その頃までにはformとcommentのchapterも来るだろうし)

                        ちょっと読んできたらライセンス上も和訳して公開してもOKみたいですし、高校時代の8年前(爆)にTOEIC740点程度の英語力ですが、挑戦してもいいですか?(´・ω・`)


                        個人的に、symfony bookの日本語版にものすごーーく助けられたので^^
                        誰かdjangoに興味を持つ日本語話者のお役に立つことがしたいな、と思ってます☆



                        PR

                        calendar

                        S M T W T F S
                             12
                        3456789
                        10111213141516
                        17181920212223
                        24252627282930
                        << September 2017 >>

                        twitter

                        selected entries

                        categories

                        archives

                        recent comment

                        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
                          プログラマー
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          よし
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          ななうぇぶ
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          よし
                        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
                          よし
                        • WindowsのPCで開発するphperがxhprofを使う方法
                          ななうぇぶ
                        • WindowsのPCで開発するphperがxhprofを使う方法
                          川本
                        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
                          よし
                        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
                          77web
                        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
                          ktz

                        recent trackback

                        • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
                          常山日記
                        • django対symfony 日本語メール送信(その1 symfony編)
                          CPA-LABテクニカル
                        • CodeIgniterでユーザー認証
                          されどLAMPな日々
                        • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
                          常山日記
                        • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
                          サーバー用語集
                        • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
                          常山日記
                        • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
                          mitszoの日記
                        • python多次元リストをsort(並べ替え)する方法?
                          mitszoの日記
                        • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
                          Humming Via Kitchen
                        • 日本語テキストをtruncate@django(Python全般にも??)
                          常山日記

                        recommend

                        links

                        profile

                        search this site.

                        others

                        mobile

                        qrcode

                        powered

                        無料ブログ作成サービス JUGEM