#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. Итак, я бы согласился с тем, что он предлагает.