Обновление данных в таблице с внешними ключами в Django
У меня есть две таблицы, одна из которых связана с другой внешним ключом. Модель store_table уже состоит из трех строк, для трех разных магазинов.
Сейчас я пытаюсь обновить модель price_table, но я не совсем уверен, что понимаю, как использовать внешние ключи, чтобы она знала, какой price_table элемент должен быть связан с каким store_table id.
Есть предложения о том, как этого достичь?
Мои две модели
class store_table(models.Model):
store = models.CharField(max_length=100, null=True)
number = models.BigIntegerField(null=True)
class Meta:
unique_together = (
(
"store",
"number",
),
)
class price_table(models.Model):
price = models.CharField(max_length=100, null=True)
dates = models.DateField(null=True, blank=True)
store_id = models.ForeignKey(
store_table, on_delete=models.CASCADE, default=None
)
class Meta:
unique_together = (
(
"dates",
"price",
),
)
Мой код для обновления таблицы price_table
update_models = price_table(
dates=dates,
price=price
)
update_models.save()
Здесь есть несколько вещей, которые меня смутили, но я думаю, что это то, что вам нужно:
# NOTE: store is the store instance you want the price to be associated with
# For example, store = store_table.objects.get(pk=...)
# And you could iterate through every store object and CREATE the price
# for that store using the code below. Again, this does not UPDATE,
# this CREATES a new price_table object for that store_table object.
update_models = price_table(
store_id=store
dates=dates,
price=price
)
update_models.save()
Почему я запутался? Приведенный выше код создаст новый объект price_table, а не обновит его. Если бы у вас уже был объект price_table, который вы хотели бы UPDATE, то есть изменить, то он уже был бы связан с магазином, и в этом случае вы могли бы сделать следующее:
# update_models here would be an object you FIND, not CREATE, for example,
# update_models = price_table.objects.get(pk=...)
update_models.dates = dates
update_models.price = price
update_models.save()
Помните, вы не можете обновить МОДЕЛЬ, вы обновляете ИНСТАНС модели. Модель - это просто шаблон для создания экземпляров или объектов на основе этой модели. Вы не обновляете шаблон, вы обновляете экземпляр. Итак, если ИНСТАНС вашей таблицы price_table еще НЕ имеет связанной с ней таблицы sales_table (вы, в конце концов, установили default=None для store_id), то вы можете модифицировать вышеприведенное так:
# Again, here, update_models will be a price_table INSTANCE you find, and
# store would be the store_table object you find, i.e.
# store = store_table.objects.get(pk=...)
# where pk is the primary key of the store you want the price associated with
update_models.store_id = store
update_models.dates = dates
update_models.price = price
update_models.save()
Еще кое-что меня смутило. Для классов нужно использовать регистр Паскаля, то есть вместо store_table писать Store, вместо price_table писать Price (это все таблицы, в конце концов).
Это еще один момент, который меня смутил. Цена должна быть каким-то числом, верно? Тогда зачем использовать ее как поле CharField? Не лучше ли вместо этого использовать DecimalField?
Надеюсь, это поможет.