2009-05-29 5 views
6

私はDjangoのオンラインストア(現在の基本的なショッピングカート)で作業しています。ユーザーにアイテムをお気に入りとしてマークする機能を追加する予定ですスタックオーバーフローで)。カートのモデルは次のようになります。匿名ユーザーに登録済みのものと同じ機能を付与

class Cart(models.Model): 
    user = models.OneToOneField(User) 

class CartItem(models.Model): 
    cart = models.ForeignKey(Cart) 
    product = models.ForeignKey(Product, verbose_name="produs") 

お気に入りモデルは、ユーザーと製品の2つの行を持つテーブルに過ぎません。

私はユーザーオブジェクトが必要なので、これは登録ユーザーの場合にのみ機能するという問題があります。登録されていないユーザーにこれらの機能を使用させ、クッキー/セッションにデータを保存させるにはどうしたらいいですか?

私は1つの選択肢がある種の一般的な関係になると思うが、それは少し複雑だと思う。たぶん、のユーザの後に特別な行があるかもしれません。これはセッションオブジェクトです(私は今までdjangoでセッションを使用していませんでした)。

基本的に、私が尋ねたいのは、以前にこの問題があった場合、どのように解決しましたか、最良のアプローチは何ですか?

答えて

9

私はこれまでにこれをしていませんでしたが、あなたの説明を読んでから、誰かが必要とすることをする必要があるときにユーザーオブジェクトを作成するだけです。次に、このユーザーオブジェクトにリンクするCookieをユーザーに送信します。そのため、誰かが(Cookieをクリアせずに)戻ってくると、同じスケルトンユーザーオブジェクトを取得します。

これは、変更を最小限に抑えて現在のコードを使用できることを意味し、完全登録ユーザーに移行する場合は、スケルトンユーザーオブジェクトにその詳細を設定することができます。

DBを整理したい場合は、過去30日間で使用されていないすべてのスケルトンユーザーを削除するタスクを追加できます。

+0

+1:匿名ユーザーには、パスワードなしで必要な一時的ユーザーIDを作成するために使用できるIPアドレスがまだあります。彼らが登録するとき、あなたは実際に彼らに適切な名前とパスワードを持ってアップグレードしています。 –

+0

いいアイデア、私はそれを考えなかった。ありがとう! –

+4

IPアドレスを一意のキーとして使用することはできません。ファイアウォールで保護さ – tzot

2

ユーザー・データをuser表に保存し、ユーザーID /パスワード表を入力しないでください。

ユーザーが登録すると、それらのフィールドに値を設定するだけです。

任意の期間に訪問していないユーザーをすべて削除するには、定期的に「クリーンアップ」スクリプトを実行する必要があります。私はこのクリーンアップをオプションにします。あなたのクライアントが手作業でやりたい場合に備えて、サーバ側(またはWeb管理インターフェース経由)で実行できるスクリプトを用意しておきます。

ユーザーエントリだけでなく、関連するすべてのエントリを削除することを忘れないでください。ユーザー登録、あなたは彼らのrequest.session.session_keyを取り、すべての行を更新することができたときに、その後

class Cart(models.Model): 
    user = models.ForeignKey(User, null=True) 
    session = models.CharField(max_length=32, null=True) 

4

はこれを行う最も簡単な方法は、ユーザIDやセッションIDの両方を格納するだろうと私には思えます新しいユーザーIDで

いっそのこと、あなたが「UserProxy」モデルを定義することができます。

class Cart(models.Model): 
    user = models.ForeignKey(UserProxy) 

class UserProxy(models.Model): 
    user = models.ForeignKey(User, unique=True, null=True) 
    session = models.CharField(max_length=32, null=True) 

をそれでは、彼らは登録時にあなただけのUserProxyテーブルを更新する必要がある、とカートについては何も変更することがありません。

+0

'user = models.ForeignKey(User、unique = True、null = True)'行に 'unique = True'を設定しますか?次に、セッションで定義された複数の「ヌル」ユーザーを持つことはできません。 –

0

私はあなたがセッションを使うことを考えていると思います。ユーザーセッションにProduct idのリストを格納し、ユーザーが登録すると、定義したとおりにカートを作成し、アイテムを追加します。 session docsをチェックしてください。

ログインしていないユーザーやアカウントを持たないユーザーが「一時」カートにアイテムを追加することを許可することができます。その人がいずれかのアカウントにログインするか、新しいアカウントを作成したら、それらのアイテムを「実際の」カートに追加します。次に、「カートにアイテムを追加」とログイン機能に数行追加するだけで、既存のモデルを使用することができます。

関連する問題