Я пытаюсь сделать то, что можно считать продвинутым SQL-запросом, и хотел бы знать, возможно ли это в Django, не прибегая к raw-SQL (я сделаю это, если это необходимо).
Я хочу объединить 1 или другую таблицу на основе значения, расположенного в таблице поиска в таблице, и хотел бы сделать это полностью в python / django.
Ниже приведены приблизительные примеры моделей, которые я использую:
class SpecificProduct(models.Model):
specific_product_id = models.AutoField(primary_key=True)
a_field = models.TextField()
something_specific_to_this_model = models.CharField()
class GeneralProduct(models.Model):
other_product_id = models.AutoField(primary_key=True)
text = models.TextField()
TABLE_CATEGORIES = {
1 : SpecificProduct,
2 : GeneralProduct,
}
class ProductCategory(models.Model):
category_id = models.AutoField(primary_key=True)
table_category = models.IntegerField() # Technically represents a table.
category_text = models.CharField(max_length=20)
class Inventory(models.Model):
inventory_id = models.AutoField(primary_key=True)
product_category = models.ForeignKey(ProductCategory, on_delete=models.CASCADE)
product_pk = models.IntegerField() # Technically foreign key to a product table.
quantity = models.IntegerField()
Мне нужен такой метод:
def get_product(category_id, product_pk):
# SQL query magic
return one_object_of_a_specific_product_type
Этот метод должен уметь делать такие вещи, как ...
- Дайте мне продукт (модель), где
product_category = 1
и
product_pk = 1
. (возвращает модель SpecificProduct)
- Дайте мне продукт, где
product_category = 2
и product_pk = 50
(возвращает модель GeneralProduct)
Как вы выполняете этот запрос в Django и возможно ли это вообще?
Edit:
Основываясь на ответе Кириети К, я создал модели, которые выглядят следующим образом:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
class SpecificProduct(models.Model):
specific_product_id = models.AutoField(primary_key=True)
specific_text = models.TextField()
class GeneralProduct(models.Model):
general_product_id = models.AutoField(primary_key=True)
text = models.TextField()
class ProductCategoryLookup(models.Model):
category_id = models.ForeignKey(ContentType, on_delete=models.CASCADE, primary_key=True)
category_text = models.CharField(max_length=20)
class Inventory(models.Model):
inventory_id = models.AutoField(primary_key=True)
product_category = models.ForeignKey(ContentType, on_delete=models.CASCADE)
product_id = models.PositiveIntegerField()
product = GenericForeignKey('product_category', 'product_id')
quantity = models.IntegerField()
def get_product(category_id, product_pk):
content_type = ContentType.objects.get(id=category_id)
inventory = Inventory.objects.get(product_category=content_type, product_id=product_pk).first()
return inventory.product