Django - хранение логических тестов в виде записей - PullRequest
0 голосов
/ 12 января 2011

Я работаю над приложением Gran Turismo 5 Django. Вот очень упрощенная модель данных:

class Event(models.Model):
    name = models.CharField(max_length=256, unique=True)

class EventCriteria(models.Model):
    name = models.CharField(max_length=256, unique=True)
    events = models.ManyToManyField(Event)
    test = ???

class Country(models.Model):
    name = models.CharField(max_length=256, unique=True)

class Make(models.Model):
    name = models.CharField(max_length=256, unique=True)
    country = models.ForeignKey(Country)

class Car(models.Model):
    name = models.CharField(max_length=256, unique=True)
    make = models.ForeignKey(Make)

class Setup(models.Model):
    name = models.CharField(max_length=256, unique=True)
    car = models.ForeignKey(Car)
    horsepower = models.IntegerField()

Например, данное событие может иметь критерии «Страна = Италия». Применительно к модели выше, это потребует теста, подобного следующему:

setup.car.make.country.name == u'Italy'

У кого-нибудь есть хорошая основа для того, чтобы я мог структурировать модель EventCriteria (особенно поле или поля 'test'), чтобы а) сохранять эти тесты и б) применять их в качестве фильтров в будущих представлениях?

Спасибо

Mike

1 Ответ

2 голосов
/ 12 января 2011

Непонятно, почему ваш «тест» не является простым логическим полем. Вопрос запутанный. Я предполагаю, что действительно хочу постоянный фильтр, так как это часто запрашивается.

Фильтр Django - это словарь.

SomeModel.objects.filter( column=value, column__contains=value )

SomeModel.objects.filter( **{'column':value, 'column__contains':value} )

Вы можете сделать это, чтобы сохранить ваш "тест".

  1. Преобразуйте выражение "фильтр" в словарь.

  2. JSON-кодировать словарь как BLOB

  3. Сохраните его.

Вы можете применить свой тест следующим образом.

  1. Получить фильтр BLOB

  2. JSON-декодировать словарь

  3. Используйте словарь в фильтре для соответствующего класса.

...