代码之家  ›  专栏  ›  技术社区  ›  Baron Young

在django模型中,我想对列值列表进行表查找,以用作我的一个字段中的选项。可能吗?

  •  0
  • Baron Young  · 技术社区  · 6 年前

    我试图获取值的模型的主键与我试图从中获取列表的列的主键不同。

    编辑:添加更多关于我想做什么的详细信息:我想从CustomerCatalog获得一个列表,其中所有记录在其“ccname”字段中的值与服务器模型/表单在其“account”字段中的值相同。这样,当我为特定帐户添加服务器时,它将在CustomerCatalog中查找针对该特定帐户的所有产品。

    这是我的想法,但它不起作用:

    class Server(models.Model):
        """
        Model representing list of servers per contract
        """
        os_license = models.CharField(max_length=95, blank=True, choices=product_list)
        account = models.ForeignKey('Account', on_delete=models.SET_NULL, null=True)
    
    
        @staticmethod
        def product_list():
             return CustomerCatalog.objects.filter(account=Server.account).values_list('ccname', flat=True)
    

    以下是CustomerCatalog模型:

    class CustomerCatalog(models.Model):
        """
        Model for representing products that have been sold and are being used by a specific customer.
        """
    
        id = models.AutoField(primary_key=True)
        ccproductid = models.ForeignKey('ProductCatalog', on_delete=models.SET_NULL, null=True, verbose_name="Product ID")
        ccname = models.CharField(max_length=200, verbose_name="Product name", blank=True)
        account = models.ForeignKey('Account', on_delete=models.SET_NULL, null=True, blank=True, help_text='Account to which this product was sold.')
        unit = models.CharField(max_length=50, help_text='Unit of measurement.', null=True, blank=True, default='VM')
        unit_price = models.DecimalField(max_digits=30, decimal_places=2, help_text="Enter price per unit.", null=True, blank=True)
        total_qty = models.DecimalField(max_digits=30, decimal_places=2, help_text="Enter quantity.", null=True, blank=True)
        total_price = models.DecimalField(max_digits=30, decimal_places=2, help_text="Enter total price (note this will be calculated in a future release).", null=True, blank=True)
        in_contract = models.BooleanField(null=False, blank=False, default=True)
        history = HistoricalRecords()
    
        @property
        def get_ccname(self):
            return self.ccproductid.name
    
        def save(self, *args, **kwargs):
            self.ccname = self.get_ccname
            super(CustomerCatalog, self).save(*args, **kwargs)
    
        class Meta:
            verbose_name_plural = 'Customer Catalog'
    
        def __str__(self):
            """
            String for representing the Model object (in Admin site etc.)
            """
            return f'{self.ccname}'
    

    这是产品目录。这是所有产品的唯一列表,以及将产品分配给单个客户时索引的内容。

    class ProductCatalog(models.Model):
        """
        Model to represent the full product portfolio.
        """
    
    
        id = models.CharField(max_length=40, help_text="Enter Product ID.", primary_key=True)
        name = models.CharField(max_length=255, help_text="Enter name of resource unit that will be used with service definitions.", unique=True)
        billing = models.CharField(max_length=70, help_text="Enter billing type.")
        unit = models.CharField(max_length=80, help_text='Unit of measurement.')
        short_description = models.TextField(max_length=400, help_text="Enter the description of the service.", blank=True)
        version = models.DateField(default=timezone.now, help_text="Enter date of the CPS version.")
        servicecat = models.ForeignKey('Service', on_delete=models.SET_NULL, null=True, blank=True, help_text='Enter the service in which this product belongs.')
        org = models.ForeignKey(OrgUnit, on_delete=models.SET_NULL, null=True, help_text="Enter organization providing the service.")
        history = HistoricalRecords()
    
        class Meta:
            verbose_name_plural = 'Product Catalog'
    
        def __str__(self):
            """
            String for representing the Model object (in Admin site etc.)
            """
            return f'{self.id}'
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   KryÅ¡tof Řeháček    6 年前

    正如您提供的错误日志中所说:

    错误:ServiceCatalog。历史服务器。os_许可证:(fields.E005)'choices'必须是包含(实际值、人类可读名称)元组的iterable。服务目录。服务器os_许可证:(fields.E005)'choices'必须是包含(实际值、人类可读名称)元组的iterable。

    方法 product_list * 返回值的平面列表,但不返回元组。应该是这样的 tuple(tuple(value, human readable name)) .因此,编辑此函数以返回这些元组的元组。可以通过映射平面数组并向其添加一些值,或者从平面数组中只取两个值来实现这一点 values_list 方法 (注意:您不能使用 flat=True ,这是禁止的,也是不可取的)。

    * 产品清单 此方法不起作用,因为您没有将intance或任何其他内容传递给此方法。所以 Server.account 不是模型实例,而是模型类。你应该像这样编辑这个函数。

    def product_list(self):
         return CustomerCatalog.objects.filter(account=self.account).values_list('os_license', 'ccname') # or map(lambda x: (x, 'Some human readable string'), ...values_list('ccname'))