如何根据多对多的相关对象的字段来过滤django中的模型?(How can I filter a model in django based on a field of a many to many related object?)
我有两个相互关联的模型,多对多。 我想根据另一个字段User.created_at筛选一个Message,与第一个字段Message.edit_date进行比较。
class Message(Model): content = CharField(max_length=512, blank=True, null=True) created_at = models.DateTimeField(blank=True, null=True) edit_date = models.DateTimeField(blank=True, null=True) users = models.ManyToManyField('User', related_name='message_user') class User(Model): name = content = CharField(max_length=48) created_at = models.DateTimeField(blank=True, null=True)
现在我通过循环两个模型并在循环中比较它们,这很慢。
message_query = Message.objects.none() for user_name, created_at_date in Users.objects.filter(name='Tina').values_list('id', 'created_at').iterator(): message_query.add(Q( users=user_id, edit_date__gte=created_at_date, ), Q.OR) messages = Message.objects.filter(message_query)
有没有办法为我试图在查询中过滤的项目创建一个过滤器?
I have two models related to each other with a many to many. I want to filter for one, Message, based on a field on the other, User.created_at, compared to a field on the first, Message.edit_date.
class Message(Model): content = CharField(max_length=512, blank=True, null=True) created_at = models.DateTimeField(blank=True, null=True) edit_date = models.DateTimeField(blank=True, null=True) users = models.ManyToManyField('User', related_name='message_user') class User(Model): name = content = CharField(max_length=48) created_at = models.DateTimeField(blank=True, null=True)
Right now I am achieving this by looping over the two models and comparing them in the loop, which is slow.
message_query = Message.objects.none() for user_name, created_at_date in Users.objects.filter(name='Tina').values_list('id', 'created_at').iterator(): message_query.add(Q( users=user_id, edit_date__gte=created_at_date, ), Q.OR) messages = Message.objects.filter(message_query)
Is there any way to create a filter for the items I'm attempting to filter for in a query?
原文:https://stackoverflow.com/questions/49578510
最满意答案
如果
this.user==null
您不会返回任何内容改变你的功能如下:
userObservabel=new BehaviourSubject(null); public getUser(): any { if (this.user == null) { this.callUserInfo().subscribe(() => { this.loadUserData(this.userId).subscribe(() => { this.userObservabel.next(this.user); }); }); return this.userObservabel.asObservable(); } else { return this.userObservabel.asObservable(); } }
然后你需要订阅它
constructor(private _auth: AuthService) { _auth.getUser().subscribe(user => this.user = user); }
You are not returning anything in case
this.user==null
Change your function as following:
userObservabel=new BehaviourSubject(null); public getUser(): any { if (this.user == null) { this.callUserInfo().subscribe(() => { this.loadUserData(this.userId).subscribe(() => { this.userObservabel.next(this.user); }); }); return this.userObservabel.asObservable(); } else { return this.userObservabel.asObservable(); } }
and then you need to subscribe it
constructor(private _auth: AuthService) { _auth.getUser().subscribe(user => this.user = user); }
相关问答
更多-
通过本地客户端程序获取服务器mysql数据库信息[2023-04-27]
ajax -
如果您查看方法定义: private makeReservation(reservationDto: ReservationDTO): Observable
您希望makeReservation方法返回一个类型为SaveResponse的Observable 。 但你不要在这里归还任何东西。 您刚开始订阅了reservationHttpService.send3DRequest 。 你应该宁愿: private makeReservation(reservationDto: R ... -
Angular2 rxjs多重结果(Angular2 rxjs multiple result)[2022-04-14]
Observable.forkJoin像这样工作: Observable.forkJoin( obs1, obs2, obs3 ).subscribe(result => { const resultOfObs1 = result[0]; const resultOfObs2 = result[1]; const resultOfObs3 = result[2]; }); 您可以map分叉结果并返回一个新的Observable .. public computePred ... -
如何等待Angular2处理动态多个Http请求?(How to Wait for Angular2 to Handle Dynamic Multiple Http Requests?)[2022-02-26]
一种方法是使用循环来构造可观察序列的数组: var data = []; for (var i = 0; i < bodies.length; i++) { data.push(this.http.post('/app/books.json', bodies[i], options).map((res:Response) => res.json())); } Observable.forkJoin(data).subscribe(data => { this.books = data; } ... -
RxJS和angular2(RxJS and angular2)[2023-05-22]
简短的回答是你不能,至少不是没有为你的服务引入某种程度的异步性。 简单的事实是没有办法强制阻塞行为并等待Observable完成,你应该返回一个Observable ,你的组件应该知道如何使用它。 export class PropertyService { private properties: Observable; constructor(@Inject(Http) http) { this.properties = this.http.get('/properties.j ... -
如果this.user==null您不会返回任何内容 改变你的功能如下: userObservabel=new BehaviourSubject(null); public getUser(): any { if (this.user == null) { this.callUserInfo().subscribe(() => { this.loadUserData(this.userId).subscribe(() => { this.userObservabel.n ...
-
您错过了DI中的几个相关部分。 使用provide和@inject或使用@Injectable装饰器有多种注入方式。 例如,在这里,你用@Injectable即装饰你的服务 import {Injectable} from 'angular2/core'; import {Http, Response} from 'angular2/http'; import {Observable} from 'rxjs/Observable'; import 'rxjs/add/operator/map'; // Y ...
-
使用Restangular在Angular中协调多个AJAX调用(Coordinating multiple AJAX calls in Angular using Restangular)[2022-02-27]
我认为$q.all()是你想要的。 这个: 将多个承诺组合成单个承诺,并在所有输入承诺解决时解决。 1 未经测试的例子: var promises = [ Rest.one('first').get(), Rest.one('second').get() ]; $q.all(promises).then(function (results) { var resultOfFirstPromise = results[0], resultOfSecondPromise ... -
combineLatest()应该这样做: private ngOnInit(): void { Observable.combineLatest( this.filesService.inputs$, this.filesService.outputs$, this.processesService.items$ ).subscribe( data => { this.inputs = data[0]; ...
-
在关于何时的jquery页面中,有一节说: 在将多个Deferred对象传递给jQuery.when()的情况下,该方法从新的“master”Deferred对象返回Promise,该对象跟踪已传递的所有Deferred的聚合状态。 在ajax页面上也有这个 从jQuery 1.5开始,$ .ajax()返回的jqXHR对象实现了Promise接口 所以我们可以将ajax的返回值赋给变量并将这些变量传递给.when 。 要稍微扩展.when页面上给出的示例并集成任意数量的ajax调用,您可以执行以下操作: ...