我想跟踪任何模型上哪些字段发生了变化(即在模型级别进行审计,因为它更具原子性,而不是像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字段上执行前/后保存.
我这么做错了吗?是否有一种更简单的方法可以实际工作?
谢谢!
我正在尝试获取多对多字段的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) 我们有一个Django应用程序,其中包含一份报纸文章列表.每篇文章都与"发言人"以及"公司"(文章中提到的公司)有m2m关系.
目前,用于创建新文章的添加文章页面非常接近我们想要的 - 它只是股票Django Admin,我们使用filter_horizontal来设置两个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) 我在 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 …
这让我很困惑......当我保存我的模型时,书对象没有改变。但是,如果我打开发票并再次保存,则会进行更改。我究竟做错了什么?
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模型项目中有一个M2M字段.在我看来,我想用update()函数更新模型实例.我知道,为了更新其他普通字段,我们可以传递字段的字典.但是如何将M2M字段传递给update()函数?
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。
有人可以教我该怎么做吗?
非常感谢你。
我正在做一个关于使用OM2M设计和实现M2M应用程序主题的项目.当我在互联网上找到一些文档时,我知道OM2M是基于ETSI-M2M和OneM2M标准定义的.这两个标准让我对相似性感到有些困惑.谁能告诉我这两个标准有什么区别,ETSI-M2M标准和OneM2M标准?
非常感谢!
为什么带有此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) 我有两个模型 — Note和Pinboard — 在 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) 我有一个模型 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 …
我是 MQTT 消息系统的新手,但我设法在运行 AOSP kk-4.4.2 的 snapdragon 板上实现了 paho Android 服务。我的服务将在启动时启动,并将通过端口 1883 连接到 HiveMQ 的公共代理。
问题是在将运行自定义 AOSP 的 Android 设备连接到服务器之后,如果我尝试从手机上运行的 Android 应用程序连接另一个客户端。骁龙板中的客户端自动与服务器断开连接。当我尝试重新连接时,它再次连接到服务器。
我在连接到服务器时使用不同的客户端 ID 和用户名