标签: m2m

使用Django的m2m_changed来修改pre_add的保存内容

我对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)

python django django-signals django-orm m2m

8
推荐指数
1
解决办法
7804
查看次数

在管理页面中编辑M2M的两面

首先,我将列出我想要实现的目标,以防有不同的方式去做!

我希望能够使用任何多选接口编辑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

python django django-forms django-admin m2m

7
推荐指数
1
解决办法
438
查看次数

在admin中显示通过'through'定义的m2m字段

我有以下模型类:

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错误.

有没有办法实现所需的功能?

django admin models m2m

7
推荐指数
1
解决办法
1974
查看次数

Django表单save_m2m

嗨我有一个模型,里面有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字段.然后,我可以继续手动保存直通表字段的数据.

谢谢

forms django many-to-many m2m

6
推荐指数
1
解决办法
6387
查看次数

复制django模型实例的所有字段

好吧,我认为这是非常基本的,但由于我是Django的新手,我不知道如何处理这个问题.

我需要复制一个django模型的实例.正如解释在这里,有一个与复制多对多的关系问题.但附件"django-model-copying.diff"具有我猜的功能.所以我不知道 - 我的Django已经有了这个功能吗?我不知道怎么称呼它.帮助将不胜感激.

django copy models m2m

6
推荐指数
2
解决办法
9404
查看次数

django tastypie:使用中间模型获得m2m关系的额外值

我正在尝试使用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)

django many-to-many m2m tastypie

6
推荐指数
1
解决办法
3004
查看次数

django用m2m_changed信号检测灯具

我很难弄清楚在夹具加载期间是否调用了信号处理程序。raw当django加载夹具时,我的大多数信号处理程序都会收到一个额外的关键字。但是,此额外的关键字仅在处理“前/后”信号时通过,如果我正在收听的信号为m2m_changed,则不会通过。

有没有可靠的方法来告诉我是否处于“灯具加载模式” m2m_changed

python django signals m2m

5
推荐指数
1
解决办法
163
查看次数

列表字段序列化程序给出“ManyRelatedManager”对象不是 M2M 字段的可迭代错误

我的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 serialization m2m django-rest-framework

5
推荐指数
1
解决办法
2508
查看次数

保存模型和相关 m2m(组)字段后如何触发操作?

如何在 Django 用户模型保存后执行某些操作,包括对 m2m 字段的相关更改,例如django.contrib.auth.models.Group

\n\n

情况

\n\n

我有一个自定义 Django 用户模型,并且希望在用户实例(包含 m2m 组成员身份等相关更改)成功保存到数据库后触发一些操作。\n这里的用例是 Wagtail CMS,我在其中ProfilePage为每个用户实例创建 s。根据用户实例的组成员身份,我需要做一些事情。

\n\n

问题

\n\n

在自定义模型save()方法中,我无法引用更改后的组成员身份,因为 m2m 是在保存用户实例后保存的。即使在调用后运行我的自定义函数super().save(),新的组成员资格仍不可用。\n但我需要获取新的组成员身份,以便根据该用户的新组执行某些操作。

\n\n

我尝试过的

\n\n

[\xe2\x9c\x98] 自定义模型save()

\n\n
# file: users/models.py\nclass CustomUser(AbstractUser):\n    super().save(*args, **kwargs)\n    do_something()\n
Run Code Online (Sandbox Code Playgroud)\n\n

[\xe2\x9c\x98] 信号 post_save

\n\n

由于上面简单的 save() 方法没有达到目的,我尝试了post_save用户模型的信号:

\n\n
# 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()\n
Run Code Online (Sandbox Code Playgroud)\n\n

...但即使在这里,我也总是从小组成员中获取“旧”价值观。

\n\n

[\xe2\x9c\x94] 信号:m2m_changed

\n\n

我了解到有一个m2m_changed信号可以用来监视表的变化 …

python django m2m

5
推荐指数
1
解决办法
564
查看次数

如何获取Ent中数字列的总和

我有两个表:productsbaskets,它们有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)

go m2m ent

5
推荐指数
1
解决办法
1211
查看次数