代码之家  ›  专栏  ›  技术社区  ›  CodeSpent

现有对象Django上的OneTomany

  •  0
  • CodeSpent  · 技术社区  · 7 年前

    我正在尝试更好地了解姜戈是如何工作的。使用下面的测试函数创建 类别、标签和项目 代表 MacBook Pro 然后添加一个 MacBook Pro 到那个类别、标签和项目(产品)。

    相关型号: (注意,我正在进行故障排除,模型可能无法准确表示问题发生时的情况)

    class Tag(models.Model):
        title = models.CharField(max_length=20)
    
        def __str__(self):
            return self.title
    
    class Item(models.Model):
        name = models.CharField(max_length=100)
        description = models.CharField(max_length=100)
        manufacturer = models.ForeignKey('Manufacturer', blank=True, null=True, on_delete=models.SET_NULL)
        introduction = models.DateField(auto_now=True)
        quanity = models.IntegerField(default=0)
        is_retired = models.BooleanField(default=False)
        tags = models.ManyToManyField(Tag)
    
        def __str__(self):
            return self.name
    
        def add(self):
            pass
    
        def remove(self):
            pass
    
        def retire(self): # Rex came up with this, roll credits.
            pass 
    
        def count(self):
            pass
    
    class OnHand(models.Model):
        name = models.CharField(max_length=100)
        serial = models.CharField(max_length=80)
        asset = models.CharField(max_length=20)
        product = models.ForeignKey(Item, blank=True, null=True, on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.serial
    

    测试用例:

    def make_macbook():
        """ Create a Manufacturer for Apple """
        apple = Manufacturer(name='Apple', rep_name='Jason Wilburn', support_number='1-800-Apple')
        apple.save()
        print('Manufacturer name: {}'.format(apple))
    
        """ Create a Category for Laptops """
        laptop = Category(name='Laptops')
        laptop.save()
        print('Category name: {}'.format(laptop))
    
        """ Create a Tag for Mac """
        mac = Tag(title='mac')
        mac.save()
        print('Tag name: {}'.format(mac))
    
        """ Create a MacBook Item """
        macbook = Item(name='Macbook Pro', description='15.5" Macbook Pro, 2018 Model', manufacturer=apple)
        macbook.save()
        print('Item name: {}'.format(macbook))
    
        """ Create a MacBook OnHand item """
        newMac = OnHand(name='MacBook Pro 15.5"', serial='SC02XP0NRJGH5', asset='DEPSC02XP0NRJGH5', product=macbook)
        newMac.save()
    
    
        return newMac.product
    

    我现在测试的是添加新的 手头 对象到 类别、标签和项目 .

    以下是我的资料:

    def add_macbook():
        """ Find MacBook Item """
        macbook = Item.objects.filter(name='Macbook Pro')
    
        """ Create a MacBook OnHand item """
        newMac = OnHand(name='MacBook Pro 15.5"', serial='000000000000000', asset='DEP0000000000000', product=macbook)
        newMac.save()
    

    我面临两个问题:

    1. 类“item”没有“objects”成员
    2. ValueError:无法分配“]>”:“OnHand.Product”必须是“item”实例。

    我怎样才能得到现有的 项目 要关联的实例?

    我也尝试过:

    def add_macbook():
        """ Find MacBook Item """
        macbook = Item.objects.get(name='Macbook Pro')
    
        """ Create a MacBook OnHand item """
        newMac = OnHand(name='MacBook Pro 15.5"', serial='000000000000000', asset='DEP0000000000000')
        newMac.save()
        macbook.product.add(newMac)
    

    这给了我明显的 “item”没有“product”属性 因为显然没有。我试过这个是因为 Tag 模型作品。

    1 回复  |  直到 7 年前
        1
  •  2
  •   c6754    7 年前

    这个 .filter() 函数返回查询集而不是单个模型实例,并且不能将整个查询集指定为外键。另一方面 .get() 将返回单个模型实例。你几乎拥有了正确的组合。试试这个:

    def add_macbook():
        """ Find MacBook Item """
        macbook = Item.objects.get(name='Macbook Pro')
    
    
        """ Create a MacBook OnHand item """
        newMac = OnHand(
            name='MacBook Pro 15.5"',
            serial='000000000000000',
            asset='DEP0000000000000',
            product=macbook
        )
        newMac.save()
    

    Class 'Item' has no 'objects' member 错误对我来说没有意义。这可能只是一个IDE警告吗?

    这里是 link 用于过滤功能。