2016-08-09 7 views
1

広告アプリを構築しています。 基本的に、ユーザーはログインして何かの広告を投稿できます。 私は以下のモデルを掲載しましたが、基本的にカテゴリ(エレクトロニクスまたは不動産)、次にサブカテゴリ(エレクトロニクス - >ラップトップまたは不動産 - >住宅、アパートなど) 問題は、異なる属性。 たとえば、ラップトップには「画面」、「ラム」、「HDD」属性があり、「車」には「マイレージ」と「条件」があります。 これらの属性をJSONFieldに格納することにしました。動的モデルの属性をフォームに読み込む - django

from django.db import models 
from django.contrib.postgres.fields import JSONField 

class Category(models.Model): 
    name = models.CharField(max_length=255) 

def __str__(self): 
    return self.name 

class SubCategory(models.Model): 
    category = models.ForeignKey('Category') 
    name = models.CharField(max_length=255) 

def __str__(self): 
    return self.name 


class Product(models.Model): 
    name = models.CharField(max_length=255) 
    subcategory = models.ForeignKey('SubCategory') 
    description = models.TextField() 
    price = models.IntegerField() 
    price_fixed = models.BooleanField(default=False) 
    monthly_payments = models.BooleanField(default=False) 
    created = models.DateField(auto_now_add=True) 
    custom_attributes = JSONField(default=dict) 


def __str__(self): 
    return self.name 

ここで、フォームとビューでこれらのカスタム属性を処理するにはどうすればよいですか? ユーザーがドロップダウンからカテゴリ/サブカテゴリを選択したときに、これらの属性をテキストフィールドとして表示し、画面サイズ、Tシャツサイズ、色などを入力する必要があります。

これは私の最初のdjangoアプリ、そして私が学んだ本はこのようなものをカバーしていませんでした。私はここからどこに行くべきか正確にはわかりません。googleで検索する/私には解決策が見つかりませんでした。

答えて

1

JSONFieldsは、Pythonが頻繁にイントロスペクションする構造化メタデータに適しています。

あなたのケースでは、フィールド設定用の別のテーブルを作成し、このテーブルをカテゴリにリンクし、製品内の値のテーブルを作成することをお勧めします。簡略化した形で:

class CategoryAtrribute(models.Model): 
    name = models.CharField() 
    value_type = models.CharField() 


class Category(models.Model): 
    attributes = models.ManyToManyField(CategoryAtrribute) 


class AttributeValues(models.Model): 
    category = models.ForeignKey('Category') 
    attribute = models.ForeignKey('CategoryAtrribute') 
    value = models.TextField() 


class Product(models.Model): 
    attribute_values = models.ManyToManyField(CategoryAtrribute, through=AttributeValues) 

ここでの問題は、基本的には2つです: 1.あなたは

をハードコーディングする必要があるフィールドの種類を確認し、そのカテゴリ 2.機能によって許可された属性だけを持つことになり、その製品を確認する必要があります

このソリューションのより単純なバージョンは、すべてのカテゴリのすべての可能なフィールドを持つテーブルメタデータを作成することです。このモデルは製品とone2oneを持ち、Categoryはそこから使用するフィールドのリストを持ちます。

+0

value_typeにはどのような種類のデータが含まれていますか? – goran

+0

このフィールドに格納されている値のタイプ - 文字列、整数など –

+0

この値で簡単にやりたいことは重要です(たとえば、最も重い車を確認するなど)。この値で保存/フィルタしたいのであれば、 'value_type'なしで扱うことができます –

関連する問題