【问题标题】:Django: How to get an object from many to many field?Django:如何从多对多领域获取对象?
【发布时间】:2019-02-08 13:35:46
【问题描述】:

我正在为我的电子商务应用程序创建数字产品。

我创建了一个模型 Product_activation 以在用户订阅产品时激活特定产品

我做了以下事情:

class Profile(models.Model):
   date = models.DateTimeField(auto_now_add=True)
   full_Name = models.CharField(max_length=32,blank=True)
   name = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
   e_mail = models.EmailField(max_length=70,blank=True)
   subscribed_products = models.ManyToManyField(Product,related_name='products_subscribed',blank=True)

class Product(models.Model):
   title        = models.CharField(max_length=32)
   price        = models.DecimalField(default=10000.00,max_digits=10,decimal_places=2)

class Product_activation(models.Model):
   user         = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
   product     = models.ForeignKey(Product,on_delete=models.CASCADE,related_name='product_activate')
   activate    = models.BooleanField(default=False)

我在下面创建了这个信号:

@receiver(pre_save, sender=Profile)
def product_activation(sender,instance,*args,**kwargs):
    if instance.subscribed_products:
        Product_activation.objects.update_or_create(
            User=instance.name,
            product=instance.subscribed_products,
            activate=False,
            deactivate=True
        )

但是product=instance.subscribed_products 的代码行有问题。

这给了我以下错误信息:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'ManyRelatedManager'

谁能告诉我我的代码做错了什么?

谢谢

【问题讨论】:

  • product=instance.subscribed_products --> product=instance.subscribed_products.all()
  • 并且看起来像错字 instance.Name 应该是小写的 instance.name
  • 只是关于命名约定的评论。请遵循PEP8 提供的风格指南。不要使用snake_case 作为类名,使用ProductActivation 而不是Product_activation。对类属性使用snake_case,例如full_name 而不是full_Name。使用动词表示方法,而不是属性,activate 应该是 is_active。顺便说一句,将activatedeactivate 作为属性非常令人困惑。如果两个值都是False,你会怎么做?
  • 请在这里阅读一下coding-style
  • 您想要单件还是全部的产品?如果单身,找到它的规则是什么?

标签: django django-models django-signals


【解决方案1】:

基于所有 cmets:

首先阅读PEP8Django coding style

要修复您当前的错误,您可以使用ManyRelatedManager 的方法all,例如它可能如下所示:

@receiver(pre_save, sender=Profile)
def product_activation(sender,instance,*args,**kwargs):
    for product in instance.subscribed_products.all():
        Product_activation.objects.update_or_create(
            User=instance.name, product=product, activate=False, deactivate=True
        )

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 2013-03-29
    • 2012-03-26
    • 1970-01-01
    • 2017-12-11
    • 2020-02-05
    • 2015-10-14
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多