#python #django #database
#python #django #База данных
Вопрос:
Я создаю веб-сайт службы заказа печати в django, и я застрял на странице заказа. У меня есть три таблицы с именами «product», «size» и «таблица sizeProductMap».
model.py
Это моя таблица продуктов.
class Product(models.Model):
prod_ID = models.AutoField("Product ID", primary_key=True)
prod_Name = models.CharField("Product Name", max_length=30, null=False)
prod_Desc = models.CharField("Product Description", max_length=2000, null=False)
prod_Price = models.IntegerField("Product Price/Piece", default=0.00)
prod_img = models.ImageField("Product Image",upload_to='productImage/', null=True)
Это таблица размеров.
class Size(models.Model):
size_id = models.AutoField("Size ID", primary_key=True, auto_created=True)
prod_size = models.CharField("Product Size", max_length=20, null=False)
Это таблица сопоставления размеров.
class SizeProductMapping(models.Model):
size_p_map_id = models.AutoField("Size amp; Product Map ID", primary_key=True, auto_created=True)
size_id = models.ForeignKey(Size, null=False, on_delete=models.CASCADE, verbose_name="Size ID")
prod_id = models.ForeignKey(Product, null=False, on_delete=models.CASCADE, verbose_name="Product Id")
Таблицы sizeProductMap хранят первичный ключ таблицы продуктов и таблицы размеров как внешний ключ, теперь я хочу получить те размеры, которые сопоставляются с конкретным продуктом.
Я хочу, чтобы все эти размеры из таблицы размеров были привязаны к определенному продукту, здесь один продукт может иметь разные размеры.
Комментарии:
1. Можете ли вы вставить свой model.py код, показывающий, как были настроены отношения?
2. я добавил модели, теперь вы можете мне помочь? Я новичок в разработке проекта, поэтому мне нужна помощь, я не знаю, как получить все размеры, привязанные к продукту. Предложите ему cde, который я должен попробовать в views.py .
Ответ №1:
В приведенном выше коде доступно много размеров для одного продукта, поэтому, когда я захожу на страницу продукта, я хочу, чтобы все размеры были указаны в списке, чтобы я мог выбрать один из них, например, думаю, что у меня есть продукт «Envelope», он может иметь разные размеры, поэтому мне нужны все эти параметры. итак, я попробовал кое-что, чем я могу поделиться с вами:
views.py
def product(request, id):
''' using id I am getting the product here'''
products = Product.objects.get(prod_ID=id)
print(products)
'''According to foreign key relationship here I am getting all the mappings available to that product'''
sizesmap = SizeProductMapping.objects.filter(prod_id=id)
for data in sizesmap:
''' Here storing all the sizes id in "sizes" variable'''
sizes = data.size_id
'''Here I am getting all the sizes related to that product and printing it now I can pass it in context and use it in the page'''
print(sizes.prod_size)
return HttpResponse(sizesmap)
Комментарии:
1. Да, эта вещь работает для меня правильно. Я благодарю вас за то, что вы дали мне свой драгоценный ответ.
Ответ №2:
Я предполагаю, что вы можете изменять свои модели и базу данных. Если вы используете существующую базу данных с данными, которые вы не хотите терять, то есть вещи, которые вы можете сделать. Но я не перечисляю их здесь.
Способ Django делать то, что вы хотите, — использовать одну из встроенных конструкций отношений, предоставляемых Django. Есть два, которые могут соответствовать вашим потребностям. Либо один ко многим, либо многие ко многим. Я приведу примеры обоих.
В зависимости от возможных значений размера, вам может понадобиться просто один ко многим:
class Product(models.Model):
prod_ID = models.AutoField("Product ID", primary_key=True)
prod_Name = models.CharField("Product Name", max_length=30, null=False)
prod_Desc = models.CharField("Product Description", max_length=2000, null=False)
prod_Price = models.IntegerField("Product Price/Piece", default=0.00)
prod_img = models.ImageField("Product Image",upload_to='productImage/', null=True)
class Size(models.Model):
size_id = models.AutoField("Size ID", primary_key=True, auto_created=True)
prod_size = models.CharField("Product Size", max_length=20, null=False)
product = models.ForeignKey(Product)
Это создаст отношение «один ко многим» с продуктом и размером. Затем, чтобы получить все размеры для данного продукта:
p = Product.object.get(prod_id=<whatever>)
for size in p.size_set.all():
print('{} - {}'.format(p.productName, size.prod_size))
Вот пример интерактивной оболочки получения нескольких размеров для одного продукта.
>>> p = Product.objects.create(prod_Name='test', prod_Desc='test2')
>>> p.size_set.create(prod_size='Medium')
<Size: Size object (1)>
>>> p.size_set.create(prod_size='Large')
<Size: Size object (2)>
>>> for size in p.size_set.all():
... print(size.prod_size)
...
Medium
Large
В вашем примере используется отношение ManyToMany, которое Django также может создавать и управлять этой средней таблицей для вас.
class Product(models.Model):
prod_ID = models.AutoField("Product ID", primary_key=True)
prod_Name = models.CharField("Product Name", max_length=30, null=False)
prod_Desc = models.CharField("Product Description", max_length=2000, null=False)
prod_Price = models.IntegerField("Product Price/Piece", default=0.00)
prod_img = models.ImageField("Product Image",upload_to='productImage/', null=True)
sizes = models.ManyToManyField("Size2")
class Size(models.Model):
size_id = models.AutoField("Size ID", primary_key=True, auto_created=True)
prod_size = models.CharField("Product Size", max_length=20, null=False)
Затем запросить его
for sizes in product.sizes.all():
print(product.prod_Name, sizes.prod_size)
Некоторая интерактивная оболочка, выполненная с помощью примера ManyToMany:
>>> p = Product.objects.create(prod_Name='foo', prod_Desc='bar')
>>> p.sizes.create(prod_size='medium')
<Size: Size object (1)>
>>> p.sizes.create(prod_size='small')
<Size: Size object (2)>
>>> for s in p.sizes.all():
... print(s)
...
Size object (1)
Size object (2)
>>> for s in p.sizes.all():
... print(s.prod_size)
...
medium
small
>>>
Комментарии:
1. Спасибо за ваш ответ, но у меня это не сработало, потому что для одного продукта доступны разные размеры, поэтому всякий раз, когда я нажимаю на продукт, мне нужны все размеры, связанные с этим продуктом, поэтому таблица сопоставления необходима.
2. Мне жаль, что это не сработало. Но оба примера с ManyToMany и OneToMany предоставляют вам разные размеры, доступные для одного продукта из базы данных. Я отредактирую некоторый код для заполнения базы данных.