标签: m2m

Django:无法使用m2m_changed信号检测多对多字段的变化 - 在模型级别进行审计

我想跟踪任何模型上哪些字段发生了变化(即在模型级别进行审计,因为它更具原子性,而不是像django和django-reversion已经可以执行的管理/表单级别).我可以使用前/后保存/删除信号为任何字段执行此操作.但是,我在m2m字段上有这样做的问题.

对于下面的代码示例,我在用户更改表单中定义'custom_groups'm2m字段,因为它是反向关系.例如,当用户在管理界面上保存表单时,如果"custom_groups"字段中有更改,我想记录.

模型:

from django.contrib.auth.models import User

class CustomGroup(models.Model):
    users = models.ManyToManyField(User, related_name='custom_groups')
Run Code Online (Sandbox Code Playgroud)

的ModelForm:

class CustomUserChangeForm(UserChangeForm):
    custom_groups = forms.ModelMultipleChoiceField(required=False, queryset=CustomGroup.objects.all())
Run Code Online (Sandbox Code Playgroud)

使用m2m_changed信号的问题是我无法检查在使用赋值运算符更新m2m字段的情况下实际更改了什么:

user.custom_groups = self.cleaned_data['custom_groups']
Run Code Online (Sandbox Code Playgroud)

这是因为在手动添加所有对象之前,内部django将在*custom_groups*上执行clear().这将执行前/后清除,然后在m2m字段上执行前/后保存.

我这么做错了吗?是否有一种更简单的方法可以实际工作?

谢谢!

django-models m2m

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

如何获取多对多字段的related_name?

我正在尝试获取多对多字段的related_name.m2m-field位于模型"Group"和"Lection"之间,并在组模型中定义如下:

lections = models.ManyToManyField(Lection, blank=True)
Run Code Online (Sandbox Code Playgroud)

该字段如下所示:

<django.db.models.fields.related.ManyToManyField object at 0x012AD690>
Run Code Online (Sandbox Code Playgroud)

印刷品field.__dict__是:

 {'_choices': [],  
 '_m2m_column_cache': 'group_id',  
 '_m2m_name_cache': 'group',  
 '_m2m_reverse_column_cache': 'lection_id',  
 '_m2m_reverse_name_cache': 'lection',  
 '_unique': False,  
 'attname': 'lections',  
 'auto_created': False,  
 'blank': True,  
 'column': 'lections',  
 'creation_counter': 71,  
 'db_column': None,  
 'db_index': False,  
 'db_table': None,  
 'db_tablespace': '',  
 'default': <class django.db.models.fields.NOT_PROVIDED at 0x00FC8780>,  
 'editable': True,  
 'error_messages': {'blank': <django.utils.functional.__proxy__ object at 0x00FC
7B50>,  
                    'invalid_choice': <django.utils.functional.__proxy__ object
at 0x00FC7A50>,  
                    'null': <django.utils.functional.__proxy__ object at 0x00FC7
A70>},  
 'help_text': <django.utils.functional.__proxy__ object at 0x012AD6F0>,  
 'm2m_column_name': <function _curried at 0x012A88F0>,  
 'm2m_db_table': <function …
Run Code Online (Sandbox Code Playgroud)

python django many-to-many django-models m2m

4
推荐指数
2
解决办法
6904
查看次数

Django Admin - 显示M2M模型的中介字段

我们有一个Django应用程序,其中包含一份报纸文章列表.每篇文章都与"发言人"以及"公司"(文章中提到的公司)有m2m关系.

目前,用于创建新文章的添加文章页面非常接近我们想要的 - 它只是股票Django Admin,我们使用filter_horizo​​ntal来设置两个m2m关系.

下一步是在每个m2m关系上添加"评级"字段作为中间字段.

所以,我们的models.py的一个例子

class Article(models.Model):
    title = models.CharField(max_length=100)
    publication_date = models.DateField()
    entry_date = models.DateField(auto_now_add=True)
    abstract = models.TextField() # Can we restrict this to 450 characters?
    category = models.ForeignKey(Category)
    subject = models.ForeignKey(Subject)
    weekly_summary = models.BooleanField(help_text = 'Should this article be included in the weekly summary?')
    source_publication = models.ForeignKey(Publication)
    page_number = models.CharField(max_length=30)
    article_softcopy = models.FileField(upload_to='article_scans', null=True, blank=True, help_text='Optionally upload a soft-copy (scan) of the article.')
    url = models.URLField(null=True, blank=True, help_text = 'Enter a URL for the article. Include …
Run Code Online (Sandbox Code Playgroud)

python django m2m

4
推荐指数
1
解决办法
1651
查看次数

DRF - 使用直通模型对 m2m 字段进行嵌套序列化

我在 DRF 中使用带有直通模型的 m2m 场。一切正常,除了当我尝试嵌套成员序列化程序时。

模型.py

class SweepStakes(models.Model):                                                          
    name = models.CharField(max_length=255)                                      

class Event(models.Model):                                                                       
    sweepstakes = models.ManyToManyField(SweepStakes, through='EventSweepStakesMembership')

class EventSweepStakesMembership(models.Model):                                  
    event = models.ForeignKey(Event, on_delete=models.CASCADE)                   
    sweepstakes = models.ForeignKey(SweepStakes, on_delete=models.CASCADE)       
    enabled = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

序列化程序.py

class EventSweepStakesSerializer(serializers.ModelSerializer):                      
    name = serializers.ReadOnlyField(source='sweepstakes.name')                     

    class Meta:                                                                     
        model = EventSweepStakesMembership                                          
        fields = ('name', 'enabled',)

class EventSerializer(BaseTenantSerializer):                                                                     
    sweepstakes = EventSweepStakesSerializer(many=True, read_only=True)             

    class Meta:                                                                     
        model = Event                                                               
        fields = ('sweepstakes',)
Run Code Online (Sandbox Code Playgroud)

在这一点上,如果我将EventSweepStakesMembership模型和EventSweepStakesSerializer视图连接到一个视图,我会得到我期望的结果,输出如下:

{"name": "thingy", "enabled" true}
Run Code Online (Sandbox Code Playgroud)

但是,当我将Event模型和EventSerializer序列化程序挂接到视图中时,该sweepstakes字段返回一个空字典而不是嵌套表示,如下所示:

{"sweepstakes": [{}]}
Run Code Online (Sandbox Code Playgroud)

请注意,它不是一个空数组,换句话说,它确实看到了相关的直通模型,但只是在显示时没有正确序列化它。

没有错误,它只是空的。我曾尝试增加depth …

python django m2m django-rest-framework

4
推荐指数
1
解决办法
2243
查看次数

Django:保存后访问 ManyToManyField 对象

这让我很困惑......当我保存我的模型时,书对象没有改变。但是,如果我打开发票并再次保存,则会进行更改。我究竟做错了什么?

class Invoice(models.Model):
    ...
    books = models.ManyToManyField(Book,blank=True,null=True)
    ...

    def save(self, *args, **kwargs):
        super(Invoice, self).save(*args, **kwargs)
        for book in self.books.all():
            book.quantity -= 1
            if book.quantity == 0:
                book.sold = True;
            book.save()
Run Code Online (Sandbox Code Playgroud)

编辑:我试过使用 post_save 信号,但它的工作方式相同。第一次保存时没有更改,第二次保存更改。

更新:似乎可以通过以下代码解决:

class InvoiceAdmin(admin.ModelAdmin):
    ...

    def save_model(self, request, obj, form, change):
        obj.save()
        for bk in form.cleaned_data['books']:
            book = Book.objects.get(pk=bk.id)
            book.quantity -= 1
            if book.quantity == 0:
                book.sold = True;
            book.save()
Run Code Online (Sandbox Code Playgroud)

django many-to-many save m2m

3
推荐指数
1
解决办法
3136
查看次数

在django中手动添加多个到多个字段(M2M)?

我的django模型项目中有一个M2M字段.在我看来,我想用update()函数更新模型实例.我知道,为了更新其他普通字段,我们可以传递字段的字典.但是如何将M2M字段传递给update()函数?

django model m2m

3
推荐指数
1
解决办法
2819
查看次数

Django,在self类中的多对多关系中,如何在ORM方面互相引用?

class User(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    gender = models.IntegerField()
    email = models.CharField(max_length=100)
    password = models.CharField(max_length=255)
    following = models.ManyToManyField("self", related_name='followers')
    objects = UserManager()
    def __repr__(self):
        return "User: {0}".format(self.name)
Run Code Online (Sandbox Code Playgroud)

在我的模型User中,用户可以彼此跟随。

我可以找到用户关注的对象:

user1 = User.objects.get(id=1)
following = user1.following.all()
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何找到用户的关注对象。

我试过了:

user1.followers.all()
Run Code Online (Sandbox Code Playgroud)

因为它是我模型中以下字段中的related_name。

有人可以教我该怎么做吗?

非常感谢你。

django orm many-to-many django-models m2m

3
推荐指数
1
解决办法
939
查看次数

ETSI-M2M标准和OneM2M标准有什么区别?

我正在做一个关于使用OM2M设计和实现M2M应用程序主题的项目.当我在互联网上找到一些文档时,我知道OM2M是基于ETSI-M2M和OneM2M标准定义的.这两个标准让我对相似性感到有些困惑.谁能告诉我这两个标准有什么区别,ETSI-M2M标准和OneM2M标准?

非常感谢!

m2m iot onem2m

2
推荐指数
1
解决办法
931
查看次数

Django Tastypie没有使用ManyToManyField更新资源

为什么带有此PUT请求的ManyToManyField资源不会更新?

curl --dump-header - -H "Content-Type: application/json" -X PUT --data '{"uuid":"blah","pass_token":"blah","favorites": ["/api/v1/organizations/1/"]}' http://localhost:8000/api/v1/devices/2/
Run Code Online (Sandbox Code Playgroud)

我收到了这个回复:

HTTP/1.0 400 BAD REQUEST
Date: Wed, 11 Jul 2012 22:21:15 GMT
Server: WSGIServer/0.1 Python/2.7.2
Content-Type: application/json; charset=utf-8

{"favorites": ["\"/api/v1/organizations/1/\" is not a valid value for a primary key."]}
Run Code Online (Sandbox Code Playgroud)

这是我的资源:

class OrganizationResource(ModelResource):
    parent_org = fields.ForeignKey('self','parent_org',null=True, full=True,blank=True)

    class Meta:
        allowed_methods = ['get',]
        authentication = APIAuthentication()
        fields = ['name','org_type','parent_org']
        filtering = {
            'name': ALL,
            'org_type': ALL,
            'parent_org': ALL_WITH_RELATIONS,
        }
        ordering = ['name',]
        queryset = Organization.objects.all()
        resource_name = 'organizations'

class …
Run Code Online (Sandbox Code Playgroud)

python django m2m tastypie

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

如何通过`through`表中的字段为Django中的M2M关系排序?

我有两个模型 — NotePinboard — 在 Django 应用程序中具有多对多关系。这两个模型通过另一个模型(Pin)相关联,因此我可以存储有关这种关系的其他信息。

我想在for Pinboard 中显示相关的Note实例。那不是问题。但我想预取笔记并在表格中的字段上订购它们。DetailViewpositionthrough

关于如何存档的任何提示(预取 + 在第三个表上排序)?

例子

这就是我到目前为止所拥有的......从某种意义上说,它是有效的,我不必查询每个条目,但我发现没有办法按它们对Note实例进行排序,position而无需对每个实例进行更多查询。

楷模

from django.db import models


class Note(models.Model):

    title = models.CharField(max_lenght=200)

    content = models.TextField()


class Pinboard(models.Model):

    title = models.CharField(max_lenght=200)

    notes = models.ManyToManyField(
        Note, blank=True, related_name='pinboards', through='Pin'
    )


class Pin(models.Model):

    class Meta:
        ordering = ['position', ]
        get_latest_by = 'position'

    pinboard = models.ForeignKey(Pinboard, related_name='note_pins')

    note = models.ForeignKey(Note, related_name='pinboard_pins')

    position = …
Run Code Online (Sandbox Code Playgroud)

python django m2m

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

Django 1.11 禁止直接分配给多对多集合的前端

我有一个模型 UserSong,它有两个 m2m 字段,其中包含模型 Genre 和 Language

class UserSong(models.Model):
    title           = models.CharField(max_length=100)
    song_file       = models.FileField(upload_to=user_song_directory_path, validators=[validate_audio_file_extension])
    genre           = models.ManyToManyField(Genre)
    language        = models.ManyToManyField(Language)
Run Code Online (Sandbox Code Playgroud)

流派是

class Genre(models.Model):
    name            = models.CharField(max_length=255)
    created_date    = models.DateTimeField(auto_now_add=True)
    updated_date    = models.DateTimeField(auto_now=True)
    status          = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

语言课是

class Language(models.Model):
    name            = models.CharField(max_length=255)
    created_date    = models.DateTimeField(auto_now_add=True)
    updated_date    = models.DateTimeField(auto_now=True)
    status          = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 UserSong 对象中添加 m2m 字段作为

genre_name_list =  Genre.objects.filter(name__in=self.cleaned_data['genre'].values_list('name',flat=True))
        # instance.genre.add(*genre_name_list)
        instance.genre.set(genre_name_list)

language_name_list =  Language.objects.filter(name__in=self.cleaned_data['language'].values_list('name',flat=True))
        # instance.language.add(*language_name_list)
        instance.language.set(language_name_list)
Run Code Online (Sandbox Code Playgroud)

这里的问题在于,m2m 表正在更新,但 Django 仍然给我错误 Direct assignment to the forward side of …

django m2m

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

当另一个客户端连接到服务器时 Mqtt 客户端断开连接

我是 MQTT 消息系统的新手,但我设法在运行 AOSP kk-4.4.2 的 snapdragon 板上实现了 paho Android 服务。我的服务将在启动时启动,并将通过端口 1883 连接到 HiveMQ 的公共代理。

问题是在将运行自定义 AOSP 的 Android 设备连接到服务器之后,如果我尝试从手机上运行的 Android 应用程序连接另一个客户端。骁龙板中的客户端自动与服务器断开连接。当我尝试重新连接时,它再次连接到服务器。

我在连接到服务器时使用不同的客户端 ID 和用户名

android m2m mqtt paho iot

0
推荐指数
1
解决办法
2535
查看次数