在 Django 中设置 M2M 对象的字段值

Setting field values for M2M object in djnago

我的应用程序中有两个模型,我正在尝试更新 M2M 字段。 Django 文档说可以使用 set() 方法来完成。但我想通过 dealt set() 接受对象的 pk 作为参数,我想做的是使用实际值设置它。

例如我在名为“adam”的客户端模型中有一个客户端,我想将其对应的 M2M 字段“items_onsale”的值设置为 [“ac”,“book”]

下面是我的模型代码:-

from django.db import models


class Client(models.Model):
    SEX_CHOICES = [('M', 'Male'), ('F', 'Female')]
    fname = models.CharField(max_length=100)
    lname = models.CharField(max_length=100)
    mailid = models.EmailField(max_length=100)
    sex = models.CharField(max_length=1, choices=SEX_CHOICES, blank=True)
    age = models.IntegerField()
    items_onsale = models.ManyToManyField('Sinfo', blank=True)

    def __str__(self):  # for displaying the variable correctly.
        return self.fname , self.lname , self.mailid , self.sex , self.age , self.items_onsale


class Sinfo(models.Model):  # data of items put on sale by clients
    iname = models.CharField(max_length=100)
    idesc = models.TextField(max_length=300, null=True)

    def __str__(self):  # for displaying the variable correctly.
        return self.iname


到目前为止我尝试过的是:-


c = Client.objects.get(pk=17)
list=["ac","book"]
c.items_onsale_set(list)

我遇到以下错误:-

ValueError:字段 'id' 需要一个数字但得到了 'book'

我知道有一种方法可以使用值更新它,但不确定如何。 django 文档确实建议使用“through_defaults”选项但没有给出任何此类示例,所以我不太确定如何使用它:-

对于多对多关系,set() 接受模型实例或字段值列表(通常是主键)作为 objs 参数。

如果需要,使用 through_defaults 参数为新的中间模型实例指定值。您可以将可调用对象用作 through_defaults 字典中的值,它们将在创建任何中间实例之前被评估一次。

我有更好的实现方法,请告诉我。

through_defaults 如果您在同一模型中有多个 foreign-keys 使用 through 选项,则选项有效。 在您的情况下,items_onsale 与客户端有直接关系,请使用添加功能而不是设置。

c = Client.objects.get(pk=17)
list=["ac","book"]
c.items_onsale.set(list)

 c = Client.objects.get(pk=17)
 list= Sinfo.objects.filter(iname__in=["ac","book"])
 c.items_onsale.add(*list)

add() 接受任意数量的参数,而不是它们的列表。 要将该列表扩展为参数,请使用 *