我对Django的信号不是很熟悉,可以使用一些帮助.
如何在保存实例之前修改pk_set?我是否必须向信号呼叫者返回一些东西(比如kwargs)?或者我保存instance自己?
作为一个简单的例子:我希望确保在pk=1保存时我的所有视频都包含类别.我该怎么做m2m_changed?
class Video(models.Model):
category = models.ManyToManyField('Category')
def video_category_changed(sender, **kwargs):
action = kwargs.pop('action', None)
pk_set = kwargs.pop('pk_set', None)
instance = kwargs.pop('instance', None)
if action == "pre_add":
if 1 not in pk_set:
pk_set.update( [ 1 ] ) # adding this to the set
# do something else?
# profit?
m2m_changed.connect( video_category_changed, sender=Video.category.through )
Run Code Online (Sandbox Code Playgroud) 首先,我将列出我想要实现的目标,以防有不同的方式去做!
我希望能够使用任何多选接口编辑M2M关系的两面(最好是在管理页面上,尽管需要它可以在普通页面上).
问题显然来自反面,因为主要方面(定义关系的地方)在自动化方面效果很好.
我已经尝试了一些建议,以获得内联显示,但它不是一个非常好的界面.
我在django邮件列表上得到的建议是使用自定义的ModelForm.我已经得到一个多选框出现,但它似乎并没有"连接"任何东西,因为它不是从任何选择开始,也不保存所做的任何更改.
这是适当的代码片段:
#models.py
class Tag(models.Model):
name = models.CharField(max_length=200)
class Project(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
tags = models.ManyToManyField(Tag, related_name='projects')
#admin.py
class TagForm(ModelForm):
fields = ('name', 'projects')
projects = ModelMultipleChoiceField(Project.objects.all(), widget=SelectMultiple())
class Meta:
model = Tag
class TagAdmin(admin.ModelAdmin):
fields = ('name', 'projects')
form = TagForm
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激,要么上面的代码工作或提供更好的方法来做到这一点!
DavidM
我有以下模型类:
class Category(models.Model):
category = models.CharField('category', max_length=200, blank=False)
class Book(models.Model):
title = models.CharField('title', max_length=200, blank=False)
categories = models.ManyToManyField(Category, blank=False, through='Book_Category')
class Book_Category(models.Model):
book = models.ForeignKey(Book)
category = models.ForeignKey(Category)
Run Code Online (Sandbox Code Playgroud)
在管理界面中添加新书对象时,我还想添加一个新类别和book_category关系.
如果我在BookAdmin中包含类别
class BookAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['categories', ]}), ...
Run Code Online (Sandbox Code Playgroud)
我收到can't include the ManyToManyField field 'categories' because 'categories' manually specifies a 'through' model错误.
有没有办法实现所需的功能?
嗨我有一个模型,里面有2到多个字段.一个是标准m2m字段,它不使用任何通过表,而另一个更复杂,并有一个通过表.我正在使用Django forms.modelform来显示和保存表单.我必须保存表单的代码是
if form.is_valid():
f = form.save(commit=False)
f.modified_by = request.user
f.save()
form.save_m2m()
Run Code Online (Sandbox Code Playgroud)
当我尝试保存表单时,我收到以下错误:
无法在指定中间模型的ManyToManyField上设置值.
我知道当我执行form.save_m2m()时会发生这种情况,因为直通表.我要做的就是告诉Django忽略带有直通表的m2m字段,但仍然保存没有直通表的m2m字段.然后,我可以继续手动保存直通表字段的数据.
谢谢
好吧,我认为这是非常基本的,但由于我是Django的新手,我不知道如何处理这个问题.
我需要复制一个django模型的实例.正如解释在这里,有一个与复制多对多的关系问题.但附件"django-model-copying.diff"具有我猜的功能.所以我不知道 - 我的Django已经有了这个功能吗?我不知道怎么称呼它.帮助将不胜感激.
我正在尝试使用Tastypie与ManyToMany关系使用中间模型(通过关键字)(https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many - 关系)
我正在使用这些模型:
class Point(models.Model):
...
value = models.FloatField(_('Value'), null=True)
rooms = models.ManyToManyField('rooms.Room', through='points.PointPosition')
class Room(models.Model):
title = models.CharField(max_length=64)
class PointPosition(models.Model):
point = models.ForeignKey('points.Point', verbose_name=_('Point'))
room = models.ForeignKey('rooms.Room', verbose_name=_('Room'))
x = models.IntegerField(_('Y'))
y = models.IntegerField(_('X'))
Run Code Online (Sandbox Code Playgroud)
我已经能够获取多对多关系,但不能获取额外的字段.这是我的tastypie代码:
class PointResource(ModelResource):
class Meta:
queryset = Point.objects.select_related(
depth=10
).prefetch_related('rooms').all()
resource_name = 'point'
allowed_methods = ['get']
...
value = fields.FloatField()
rooms = fields.ToManyField('rooms.api.RoomResource', 'rooms', full=True)
class RoomResource(ModelResource):
class Meta:
queryset = Room.objects.all()
resource_name = …Run Code Online (Sandbox Code Playgroud) 我很难弄清楚在夹具加载期间是否调用了信号处理程序。raw当django加载夹具时,我的大多数信号处理程序都会收到一个额外的关键字。但是,此额外的关键字仅在处理“前/后”信号时通过,如果我正在收听的信号为m2m_changed,则不会通过。
有没有可靠的方法来告诉我是否处于“灯具加载模式” m2m_changed
我的models.py 看起来像这样:
class IP(models.Model):
name = models.CharField(max_length=30, unique=True)
address = models.CharField(max_length=50, unique=True)
class IPGroup(models.Model):
name = models.CharField(max_length=50, unique=True)
ips = models.ManyToManyField('IP', through='IPGroupToIP')
class IPGroupToIP(BaseModel):
ip_group = models.ForeignKey('IPGroup', on_delete=models.CASCADE)
ip = models.ForeignKey('IP', on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
现在,为了创建 IPGroup,我有以下序列化程序:
class IPGroupCreateSerializer(serializers.ModelSerializer):
ips = serializers.ListField()
class Meta:
model = IPGroup
fields = ['name', 'ips']
@transaction.atomic()
def create(self, validated_data):
ips_data = validated_data.pop('ips', None)
ip_group = IPGroup.objects.create(name=validated_data['name'])
if ips_data:
for ip in ips_data:
ip_obj, created = IP.objects.get_or_create(name=ip['name'], address=ip['address'])
IPGroupToIP.objects.create(ip_group_id=ip_group.id, ip_id=ip_obj.id)
return ip_group
Run Code Online (Sandbox Code Playgroud)
我的视图是一个简单的基于类的视图,如下所示:
class IPGroupCreateView(generics.CreateAPIView):
queryset = IPGroup.objects.get_queryset() …Run Code Online (Sandbox Code Playgroud) 如何在 Django 用户模型保存后执行某些操作,包括对 m2m 字段的相关更改,例如django.contrib.auth.models.Group?
我有一个自定义 Django 用户模型,并且希望在用户实例(包含 m2m 组成员身份等相关更改)成功保存到数据库后触发一些操作。\n这里的用例是 Wagtail CMS,我在其中ProfilePage为每个用户实例创建 s。根据用户实例的组成员身份,我需要做一些事情。
在自定义模型save()方法中,我无法引用更改后的组成员身份,因为 m2m 是在保存用户实例后保存的。即使在调用后运行我的自定义函数super().save(),新的组成员资格仍不可用。\n但我需要获取新的组成员身份,以便根据该用户的新组执行某些操作。
save()# file: users/models.py\nclass CustomUser(AbstractUser):\n super().save(*args, **kwargs)\n do_something()\nRun Code Online (Sandbox Code Playgroud)\n\n由于上面简单的 save() 方法没有达到目的,我尝试了post_save用户模型的信号:
# file users/signals.py\n@receiver(post_save, sender=get_user_model())\ndef handle_profilepage(sender, instance, created, **kwargs):\n action = \'created\' if created else \'updated\'\n do_something()\nRun Code Online (Sandbox Code Playgroud)\n\n...但即使在这里,我也总是从小组成员中获取“旧”价值观。
\n\n我了解到有一个m2m_changed信号可以用来监视表的变化 …
我有两个表:products和baskets,它们有M2M关系,表名是basket_products。我试图获取与篮子相关的具体products总数price和数量,但我再次陷入困境。如何修复以下代码以获得结果?注意:我正在使用该Ent框架
err = client.Basket.
Query().
Where(basket.ID(2)).
WithProducts().
QueryProducts().
GroupBy("price").
Aggregate(func(selector *sql.Selector) string {
return sql.As(sql.Sum("price"), "price")
}).Scan(ctx, &r)
if err != nil {
log.Println(err)
}
log.Println(r)
Run Code Online (Sandbox Code Playgroud) m2m ×10
django ×9
python ×4
many-to-many ×2
models ×2
admin ×1
copy ×1
django-admin ×1
django-forms ×1
django-orm ×1
ent ×1
forms ×1
go ×1
signals ×1
tastypie ×1