2016-08-09 2 views
1

Итак, я создаю приложение для рекламы. В основном, пользователи вступают в систему, и они могут размещать рекламу на что-то. Я разместил модели ниже, но в основном у меня есть категория (скажем, электроника или недвижимость), затем подкатегория (электроника-> Ноутбук или недвижимость-> дом, квартира и т. Д.) Проблема в том, что у разных предметов есть разные атрибуты. Например, ноутбук может иметь атрибуты «screen», «ram» и «hdd», в то время как «Car» может иметь «пробег» и «условие». Я решил сохранить эти атрибуты в 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 

Теперь, как обрабатывать эти пользовательские атрибуты в форме и представлениях? Мне нужно сделать так, чтобы, когда пользователь выбирает категорию/подкатегорию из выпадающего списка, эти атрибуты должны отображаться в виде текстовых полей, и пользователь вводит размер экрана, размер или цвет футболки и т. Д.

Это мое первое приложение django и книга, которую я изучил, не охватывали такие вещи, и я не совсем уверен, куда идти отсюда, поиск в google/SO не нашел мне решения.

ответ

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) 

Проблема здесь в основном два: 1. Вы должны убедиться, что продукт будет иметь только атрибуты, разрешенные его категория 2. Функции проверки типов полей должны быть зашиты

Простейшей версией этого решения является создание таблицы метаданных со всеми возможными полями для всех категорий. Эта модель будет иметь one2one с продуктом, а Category будет иметь список полей для использования с нее.

+0

Какие данные должны входить в value_type? – goran

+0

Тип значения, хранящегося в этом поле - строка, int и т. Д. –

+0

Важно только, если вы хотите сделать что-то с этим значением (например, проверить, какой автомобиль самый тяжелый). Если вы хотите хранить или фильтровать по этим значениям, вы можете иметь дело без 'value_type' –