Гибкие имена списков полей в классе моделей django

#django #django-models

#django #django-модели

Вопрос:

Вместо динамического изменения файла моделей путем добавления полей, как мне сказали, очень плохо, я предполагаю поддерживать определенную гибкость, имея имена списков переменных полей (я думаю).

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

Однако я не могу понять, как создавать имена списков переменных полей в моем классе моделей. У меня возникли проблемы с просеиванием материалов для чтения, чтобы найти решение моей проблемы, а пробный период составляет 15 часов и подсчет.

Может ли кто-нибудь указать мне правильное направление.

Новое редактирование

Вот чего я пытаюсь достичь.

Когда добавляется атрибут, я добавляю его в таблицу следующим образом.

     c = 'newattributename'

    conn = mdb.connect('localhost', 'jamie', '########', 'website')
    cursor = conn.cursor()
    cursor.execute("alter table mysite_weightsprofile add column %s integer not null; SET @rank=0; UPDATE mysite_weightsprofile SET %s = @rank:=@rank 1 order by %s DESC;" %  (c, c, a))
    cursor.close()
    conn.close()
  

Теперь в моем классе моделей у меня есть

 class WeightsProfile(models.Model):
    1attributes = models.IntegerField()
    2attributes = models.IntegerField()
    3attributes = models.IntegerField()

class UserProfile(WeightsProfile):
    user = models.ForeignKey(User, unique=True)
    aattributes = models.CharField()
    battributes = models.CharField()
    cattributes = models.CharField()
  

Теперь все, что я хочу сделать, это получить доступ к новому атрибуту, который был добавлен в таблицу, но не добавлен в файл моделей.

Есть ли у sberry2A правильный ответ. Я надеюсь, что это так, это кажется самым простым.

Комментарии:

1. Было бы очень полезно, если бы вы привели примеры того, что именно вы пытаетесь сделать (модель, которая представляет X, нуждается в атрибутах для Y, потому что Z). Без контекста очень сложно ответить на ваш вопрос.

2. хорошо, я дам один после обеда

3. Смешивание необработанного SQL для создания таблиц и ORM для их запроса — это рецепт для многих поздних ночей отладки, IMO. Будьте проще, поэтому ответ sberry имеет смысл, если вы хотите придерживаться MySQL

Ответ №1:

Возможно, я не понимаю, о чем вы спрашиваете, но предполагаю, что у вас есть какая-то модель, например Person, которая начнет с некоторых определенных полей, но в будущем может быть добавлено еще несколько…

 class Person(models.Model):

    fname = models.CharField(max_length=255)
    lname = models.CharField(max_length=255)
    age = models.IntegerField()
    # more fields to come
  

Тогда вы могли бы использовать модель PersonAttribute…

 class PersonAttribute(models.Model):

    name = models.CharField(max_length=32)
    value = models.CharField(max_length=255)
  

Тогда вы могли бы просто добавить поле отношений ManyToMany к своему Person…

     attributes = models.ManyToManyField(PersonAttribute)
  

Или что-то подобное.

Комментарии:

1. Возможно, я неправильно указал, что я ищу, судя по всему. По сути, вы начинаете с вышесказанного, пользователь что-то делает, и, возможно, цвет глаз или длина ногтей на ногах или даже длина ресниц добавляются в базу данных mysql. Мне нужен способ доступа к этим атрибутам «на лету» без какой-либо ретуши файла моделей.

2. Этот пример делает именно это: PersonAttribute s являются произвольными строками ключей / значений (хотя в нем отсутствует внешний ключ Person ). Вам действительно следует подумать о том, чтобы максимально сгладить свои данные 🙂

3. Вы могли бы использовать JSONField (см. django-extensions ) для хранения всего, что вам нравится, в текстовом двоичном объекте, притворяющемся JSON, но вы не сможете запросить для этого базу данных. Если бы вы использовали Postgres, я бы посоветовал проверить его поддержку funky hstore key-value.

4. тогда я изучу это, посмотрю, смогу ли я это понять.

Ответ №2:

Я не совсем понимаю, что вы пытаетесь сделать, но South — хорошая система для обработки изменений в моделях. Он выполняет миграции, чтобы понимать внесенные вами изменения и знать, как изменить их в базе данных таким образом, чтобы вы могли использовать как для сайтов разработки, так и для производства.

Комментарии:

1. Приветствую, я посмотрю на это. Самое неприятное, что я знаю, что есть какое-то элегантное простое решение для того, что я хочу в самом django, я просто не могу понять это.

Ответ №3:

Я тоже не понимаю, что вам нужно, JT, но я действительно сомневаюсь, что South (см. @Dougal) поможет вам, если то, что вы хотите, сводится к «Посмотрите на соответствующую таблицу DB, чтобы узнать, какие поля должны быть у модели во время чтения. Но не время записи. «. South отлично подходит для разработки схем / моделей, но не во время выполнения, а не непоследовательно по строкам / экземплярам моделей. И взлом моделей во время выполнения — это, безусловно, мир вреда.

Действительно, ORM Django не создан для динамических полей (по крайней мере, на данный момент) — он был создан для абстрактного написания SQL и ускорения разработки с использованием СУБД, а не без схемы / NoSQL.

Кстати говоря, если кто-то предоставил мне спецификацию, в которой фактически говорилось: «Мы не знаем, какие поля должна будет хранить модель», я бы предложил попробовать MongoDB для этих данных (наряду с Postgres для традиционных реляционных данных), вероятно, через MongoEngine

Комментарии:

1. черт, это только немного усложнило жизнь.

2. решение sberry (в настоящее время приведенное выше) — это совместимый с MySQL, удобный для ORM способ делать то, что вы хотите. Да, это приведет к куче объединений в запросах, но я бы поспорил, что вы не беспокоитесь о производительности для динамических данных, иначе вы бы уже думали о Mongo / Cassandra / nonrel. Итак, я бы согласился с тем, что он предлагает.