在 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() 接受任意数量的参数,而不是它们的列表。
要将该列表扩展为参数,请使用 *
我的应用程序中有两个模型,我正在尝试更新 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() 接受任意数量的参数,而不是它们的列表。 要将该列表扩展为参数,请使用 *