【问题标题】:Django queryset join tablesDjango 查询集连接表
【发布时间】:2020-07-17 19:28:03
【问题描述】:

我真的被合并两个表所困扰。

我有表格 Item 和 Transactions

class Item(models.Model):
    category_choices = []
    item_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    description = models.TextField()
    category = models.CharField(max_length=100, choices=category_choices)
    image = models.ImageField(upload_to='media')
    stock = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    date_added = models.DateTimeField(default=timezone.now())

class Transactions(models.Model):
    transaction_id = models.AutoField(primary_key=True)
    order_id = models.UUIDField()
    item_id = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='transactions')
    quantity = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    transaction_date = models.DateTimeField(auto_now_add=True)
    username = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    address_str = models.CharField(max_length=100)
    address_plz = models.CharField(max_length=100)
    address_place = models.CharField(max_length=100)
    address_country = models.CharField(max_length=100, choices=[(name[1], name[1]) for name in countries])

现在我想用来自项目模型的交易、图像和项目信息来渲染模板。我正在尝试使用 prefetch_related,但是 rit 不起作用,我不明白应该如何解决。

def order_history(request):
    if request.user.is_authenticated:
        transaction = Transactions.objects.order_by('-transaction_date').\
            filter(username=request.user).prefetch_related('item')

        context = {'orders': transaction}
        template_name = 'retail/order_history.html'
        return render(request, template_name, context=context)
    else:
        raise Http404('You are not authorised')

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    在您的交易表中,将您的项目列命名为 item 而不是 item_id

    item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='transactions')
    

    那么您的prefetch_related("item") 将按预期工作。

    【讨论】:

    • 但从数据库的角度来看,它没有多大意义。我现在正在考虑使用 sqlalchemy 来解决这个问题
    • Django ORM 处理 Python 对象。将“Item”称为“item_id”是没有意义的——Item ID 只是 Item 对象的一个​​属性。在内部,Django 将其表示为数据库表中的 item_id。这是一个引用您的 Item 表的外键。
    • 改了,但是没用,还是报错,表Item中的那个属性不存在>>> Transactions.objects.order_by('-transaction_date').filter(username='admin').prefetch_related('item')[0].username 'admin' >>> Transactions.objects.order_by('-transaction_date').filter(username='admin').prefetch_related('item')[0].stock Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: 'Transactions' object has no attribute 'stock'
    猜你喜欢
    • 2013-06-26
    • 2016-08-20
    • 2023-03-12
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2018-03-06
    • 2011-09-23
    • 2019-08-05
    相关资源
    最近更新 更多