Ошибки при переносе моделей

При попытке миграции моделей (команда 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()
Вернуться на верх