Ошибки при переносе моделей
При попытке миграции моделей (команда makemigrations) возникают ошибки. Ошибки в классах Cart и Product. Вот код:
class Cart(models.Model):
type_status = (('Pending'), ('Ongoing'), ('Delivered'))
type_payment = (('Yes'), ('No'))
cart_id = models.AutoField(primary_key=True)
status = models.CharField(max_length=1, choices=type_status)
payment_paid = models.CharField(max_length=1, choices=type_payment)
totalAmount = models.FloatField()
class Product(models.Model):
item_id = models.ForeignKey(Admin, on_delete=models.CASCADE)
itemName = models.ForeignKey(Admin, on_delete=models.CASCADE)
price = models.FloatField()
ERRORS:
registration.Cart.payment_paid: (fields.E005) 'choices' must be an iterable containing (actual value, human readable name) tuples.
registration.Cart.status: (fields.E005) 'choices' must be an iterable containing (actual value, human readable name) tuples.
registration.Product.itemName: (fields.E304) Reverse accessor 'Admin.product_set' for 'registration.Product.itemName' clashes with reverse accessor for 'registration.Product.item_id'.
HINT: Add or change a related_name argument to the definition for 'registration.Product.itemName' or 'registration.Product.item_id'. registration.Product.item_id: (fields.E304) Reverse accessor 'Admin.product_set' for 'registration.Product.item_id' clashes with reverse accessor for 'registration.Product.itemName'.
HINT: Add or change a related_name argument to the definition for 'registration.Product.item_id' or 'registration.Product.itemName'.
Вы должны передавать кортежи в выборе. Вам также необходимо установить max_length
, по крайней мере, как самое длинное значение в choices.
type_status = (('pending', 'Pending'), ('ongoing', 'Ongoing'), ('delivered', 'Delivered'))
type_payment = (('yes', 'Yes'), ('no', 'No'))
Первая строка - это значение, которое вы храните в БД, вторая - человекочитаемое (которое вы увидите в select input).
См. DOCS
Это не правильный способ, который вы сделали для выбора:
Выполните следующий код:
type_status = (
('Pending', 'Pending'),
('Ongoing', 'Ongoing'),
('Delivered', 'Delivered'),
)
Эта ошибка будет решена И не забудьте указать max_length=100
в том поле модели, где вы добавили CHOICES
Приведите ForeignKey.related_name
для обоих внешних ключей, то есть item_id
и itemName
все, что вы хотите, чтобы они не столкнулись:
class Product(models.Model):
item_id = models.ForeignKey(Admin, on_delete=models.CASCADE, related_name="id_item")
itemName = models.ForeignKey(Admin, on_delete=models.CASCADE, related_name="name_of_item")
price = models.FloatField()
Затем выполните команду migrate.
Примечание: Обычно поля моделей записываются в
pascal_case
, поэтому вы можете изменить его наtotal_amount
извtotalAmount
Cart
модели. Также не стоит называть одинаковые внешние ключи в обеих моделях.
Ошибка Reverse Accessor вызвана схожими именами полей в моделях Admin
и Product
.
Измените имена полей модели Product
, или добавьте атрибут related_name
и определите другое имя. (Например, p_item_name, p_item_id)
пример кода:
class Product(models.Model):
item_id = models.ForeignKey(Admin, related_name="p_item_id",
on_delete=models.CASCADE)
itemName = models.ForeignKey(Admin, related_name="p_item_name",
on_delete=models.CASCADE)
price = models.FloatField()