【问题标题】:retrieve data from manytomany field in the sequence of it was saved django按照保存 django 的顺序从 manytomany 字段中检索数据
【发布时间】:2022-01-16 06:32:33
【问题描述】:

我有一个发票系统,员工或员工可以在其中创建发票,并可以为特定客户添加多个产品和数量。当我使用 mysql 时,我无法获取 json 数据或数组数据。所以我将数量和价格(折扣和其他修改后)作为字符串,然后在显示或打印发票时,我使用正则表达式查找数量和价格.我在一个manytomay字段中添加了产品ID,我从中获取产品名称和售价。在我使用 zip 时在打印页面上显示数据时,产品显示为产品的 ID,因此我想以保存数据的方式检索数据。或者你能告诉我有什么更简单的方法吗? 这是我的 models.py

class Invoice(models.Model):
    customers = models.ForeignKey(Customer, on_delete=models.CASCADE)
    products = models.ManyToManyField(Product)
    total = models.FloatField()
    date = models.DateField(auto_now_add=True)
    amounts = models.CharField(max_length=500, default="00")
    quantity = models.CharField(max_length=500, blank=True)
    def save(self, *args, **kwargs):
        if not Invoice.objects.count():
            self.id = 20210001
        else:
            self.id = Invoice.objects.last().id + 1
        super(Invoice, self).save(*args, **kwargs)

这是我的打印页面功能的views.py

def final_billing(request, id=None):
    pk = id
    obj = Invoice.objects.get(id=pk)
    products = obj.products.all()
    customer = Customer.objects.get(id=obj.customers.id)
    amn = obj.amounts
    qt = obj.quantity
    list_of_comma = re.findall("[\d+.+\d]+", amn)
    amnts = [float(n) for n in list_of_comma]
    list_of_quantity = re.findall('[0-9]+', qt)
    qty = [int(n) for n in list_of_quantity if n.isdigit()]
    products = list(products)
    both = zip(products,amnts,qty)
    return render(request, 'finalbill.html',{'bills': obj, "due": customer, "both": both})

我希望按照保存的顺序检索产品对象

【问题讨论】:

    标签: python-3.x django django-views


    【解决方案1】:

    查询只能使用特定字段进行排序,否则 Django 无法猜测,因此在您的情况下,最好的情况是按产品创建日期对产品进行排序,例如:

    obj.products.all().order_by("created") 
    

    这假设您有一个“created”字段,每次将产品保存到数据库中时都会添加该字段。

    另一种方法是从文档中指定通过选项

    您可以使用 through 选项来指定代表您要使用的中间表的 Django 模型。 此选项最常见的用途是当您希望将额外数据与多对多关系相关联时。

    通过表包含关系的主键,您可以使用它来检索添加对象的顺序。

    例如:

        from django.db import models
    
    class Person(models.Model):
        name = models.CharField(max_length=50)
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(
            Person,
            through='Membership',
            through_fields=('group', 'person'),
        )
    
    class Membership(models.Model):
        group = models.ForeignKey(Group, on_delete=models.CASCADE)
        person = models.ForeignKey(Person, on_delete=models.CASCADE)
        inviter = models.ForeignKey(
            Person,
            on_delete=models.CASCADE,
            related_name="membership_invites",
        )
        invite_reason = models.CharField(max_length=64)
    

    Through Field

    【讨论】:

    • 它会和现在一样。但我想检索它在 manytomany 字段中的设置方式。
    • 好的,在这种情况下,我已经更新了我的答案,你需要重新设计你的模型,但幸运的是 Django 为你提供了一个不错的选择。
    • 感谢您的帮助。但问题是我的情况更加不同。我的表现方式不好。现在我已经更新了我的问题。如果你能帮我检查一下,我会很高兴的。
    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 2013-06-27
    • 2018-12-07
    • 2012-03-08
    • 1970-01-01
    • 2019-06-15
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多