Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中迭代指向对象的所有外键而不使用_集表示法?_Python_Django_Inheritance_Foreign Keys - Fatal编程技术网

Python 如何在Django中迭代指向对象的所有外键而不使用_集表示法?

Python 如何在Django中迭代指向对象的所有外键而不使用_集表示法?,python,django,inheritance,foreign-keys,Python,Django,Inheritance,Foreign Keys,我是Django的新手,但我正在开发一个遵循CPQ流程或配置、定价、报价的应用程序。用户应该选择他们想要配置的产品以及与之配套的选项。选择后,程序应查询外部定价数据库以计算价格。从那里,程序应将定价和文本数据输出到PDF报价中。我能够使用从基本产品类继承的特定产品使应用程序工作。现在的问题是,我已经创建了第二个product子类,我不能使用单数的“related_name”。为了提高可读性,我省略了与下拉字段相关的列表,但我在下面发布了models.py文件 有没有一种方法可以遍历使用外键指向Q

我是Django的新手,但我正在开发一个遵循CPQ流程或配置、定价、报价的应用程序。用户应该选择他们想要配置的产品以及与之配套的选项。选择后,程序应查询外部定价数据库以计算价格。从那里,程序应将定价和文本数据输出到PDF报价中。我能够使用从基本产品类继承的特定产品使应用程序工作。现在的问题是,我已经创建了第二个product子类,我不能使用单数的“related_name”。为了提高可读性,我省略了与下拉字段相关的列表,但我在下面发布了models.py文件

有没有一种方法可以遍历使用外键指向Quote对象的产品对象?我找到的许多与此相关的答案都可以通过指定“\u set”或“related\u name”来解决。我见过其他答案使用select_related()方法,但是,我似乎无法正确地得到查询,因为程序不知道需要查看哪个集合。一个报价单可以有任意组合的产品实例,因此我不确定如何处理该查询。同样,我使用django还不到6个月,所以我有点生疏。我不确定我是否只是没有从根本上理解这里的大局。我考虑过不使用继承,而是将产品作为一个独立类,并将Compact或WRC信息保存到其中,这样我就可以只使用一个“related_name”,但也认为这只会创建另一个仍然会失败的嵌套层

任何帮助都将不胜感激!我肯定撞到墙了

models.py

课程报价(models.Model):

类别产品(型号.型号):

紧凑类(产品):

WRC类(产品):


我能够解决我的问题,但我想回答,以防有人遇到与我类似的问题。通过修改QuoteDetailView的get_context_data()方法,我能够动态地获取所有附加到quote实例的产品对象。我还需要使用django.contrib.admin.utils中的django库nestedObject来获取报价实例的所有相关对象。我还向Product类添加了一个timestamp字段,以便能够对它们进行排序。QuoteDetailView复制如下

类QuoteDetailView(FormMixin,DetailView):

project_name = models.CharField(max_length=256,blank=True)
customer_first_name = models.CharField(max_length=256,blank=True)
customer_last_name = models.CharField(max_length=256,blank=True)
company_name = models.CharField(max_length=256, blank=True)
address1 = models.CharField(max_length=256, blank=True, help_text ="Address")
address2 = models.CharField(max_length=256, blank=True)
city = models.CharField(max_length=256, blank=True, default="")
state = models.CharField(max_length=256, blank=True, default="")
zip_code = models.CharField(max_length=256, blank=True, default="")
country = models.CharField(max_length=256, blank=True, default="")
phone = PhoneField(blank=True)
email = models.EmailField(max_length=254,blank=True)
grand_total = models.FloatField(default=0)
create_date = models.DateTimeField(default = timezone.now)
class Meta:
    abstract = True

price = models.FloatField(default=0)
total_price = models.FloatField(default=0)
quantity = models.IntegerField()
quote = models.ForeignKey('quote.Quote', on_delete=models.CASCADE)
quantity = models.IntegerField()
base_size = models.CharField(choices=size, max_length = 256)
filter = models.CharField(choices=filter_list, max_length = 256)
product_name = models.CharField(max_length=256,default="Compact")
base_size = models.CharField(choices=size, max_length = 256)
construction = models.CharField(choices=construction_list, max_length = 256)
outlet = models.CharField(choices=outlet_list, max_length = 256)
product_name = models.CharField(max_length=256,default="WRC")
model = Quote
form_class = ProductSelectForm



def get_context_data(self, **kwargs):
        ### collects related objects from quote 
    collector = NestedObjects(using=DEFAULT_DB_ALIAS)
    collector.collect([kwargs['object']])
        ### slice off first element which is the quote itself
    related_objects = collector.nested()
    related_objects = related_objects[1:]
        ### get context data for qoute object 
    context = super().get_context_data(**kwargs)
    context['now'] = timezone.now()
        ### if number of list items is above 0, then add them to the context
        ### and sort by timestamp
    if len(related_objects) != 0:
        context['items'] = sorted(related_objects[0], key=lambda x: x.timestamp)

    return context