#python #django #django-models
#python #django #django-модели
Вопрос:
Я новичок в django и создаю своего рода приложение на основе пакетов (отправлений) в Django, и у меня есть эти модели,
class ShippingLocation(models.Model):
latitude = models.IntegerField()
longitude = models.IntegerField()
class Shipping (models.Model):
email = models.EmailField()
location = models.ForeignKey(ShippingLocation , default=None, on_delete=models.CASCADE )
class Package(models.Model):
name = models.CharField(max_length=30)
supplier = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
to = models.ForeignKey(Shipping, default=None, on_delete=models.CASCADE )
пока это работает нормально, но мне интересно, можно ли удалить ShippingLocation
модель и использовать настраиваемое поле вместо поля местоположения в модели доставки? Если да, то как мне создавать пользовательские поля и как мне их реализовать?
итак, у меня есть что-то вроде
class Shipping (models.Model):
email = models.EmailField()
location = models.DictionaryField()
и я избавляюсь от ShippingLocationModel
Комментарии:
1. Что вы подразумеваете под пользовательским полем? Как это будет выглядеть?
2. Я только что отредактировал вопрос
3. Если вы используете prostgres, это полезно знать docs.djangoproject.com/en/3.1/ref/contrib/postgres/fields , в противном случае проверьте это. docs.djangoproject.com/en/3.1/howto/custom-model-fields Лично я считаю, что нынешний подход является лучшим (я знаю, что это не ответ на ваш вопрос, просто некоторые отзывы)
4. я использую sqlite
5. Django поддерживает jsonfield docs.djangoproject.com/en/3.1/ref/contrib/postgres/fields /… но я не рекомендую этого делать.
Ответ №1:
Я предполагаю, что вы хотели перенести существующие данные из ShippingLocation в Shipping. Если вы только работаете над разработкой, просто удалите свой файл sqlite3 и измените свои модели в соответствии с вашими ожиданиями.
Если вы уже используете prod, я обычно делаю это:
- Добавьте поле location_dictionary в Shipping (не обязательно). Миграция
- Напишите логику одноразовой миграции, чтобы переместить все в ShippingLocation в поле location_dictionary
- Удалите модель местоположения доставки
- Удалите поле местоположения
- Переименуйте поле location_dictionary…
Комментарии:
1. его вопрос о том, как он может создать поле «location_dictionary», а не о том, как произойдет миграция
2. Если он уже знает о пользовательском поле (что он и делает), он будет знать, как его создать, поскольку его вариант использования прост. Очевидно, вы не знаете об этом, как я могу судить по вашему вопросу «Что вы подразумеваете под пользовательским полем? Как это будет выглядеть? »
3. посмотрите на заголовок вопроса. Также речь идет не о том, что я знаю или не знаю, просто хотел убедиться, что ОН понимает, что он хочет делать…
Ответ №2:
Это должно работать:
- удалите базу данных SQLite
- измените модель
- затем запустите команду migrate
Комментарии:
1. Его вопрос касается создания «поля словаря», а не о том, как запустить команду переноса. И, к вашему сведению, вы не должны удалять какую-либо базу данных вообще. Правильным процессом было бы внести изменения, запустить makemigrations и выполнить миграцию (ничего не удаляя). весь смысл миграции заключается в том, чтобы иметь возможность изменять схему БД без потери каких-либо данных.