django:GenericForeignKeyのフィールドに基づいてクエリを実行するにはどうすればよいですか?



Django How Do I Query Based Genericforeignkeys Fields



解決:

NS定義したTicket.issueフィールドは、へのチケットインスタンス添付されている問題ですが、後戻りできません。 2番目の例に近づいていますが、issue_idフィールド-クエリを実行することはできませんGenericForeignKey(それはあなたが持っているときにあなたがオブジェクトを取得するのを助けるだけですチケットインスタンス)。これを試して:

from django.contrib.contenttypes.models import ContentType issue = Issue.objects.get(scan = scan_obj)tickets = Ticket.objects.filter(issue_id = issue.id、issue_ct = ContentType.objects.get_for_model(issue).id) 

全体のフィルタリングGenericForeignKeyは、共有する2番目のモデルを作成することで可能です。db_table withチケット。まず、チケットを抽象的なモデルと具体的なモデルに分割します。



class TicketBase(models.Model):issue_ct = models.ForeignKey(ContentType、related_name = 'issue_content_type')issue_id = models.PositiveIntegerField(null = True、blank = True)class Meta:abstract = True class Ticket(TicketBase):issue = generic.GenericForeignKey( 'issue_ct'、 'issue_id')

次に、サブクラスも作成するモデルを作成しますTicketBase。このサブクラスには、を除いてすべて同じフィールドがあります代わりにとして定義されている問題外部キー。カスタムの追加Managerを使用すると、1つだけにフィルタリングできますContentType。

このサブクラスは同期または移行する必要がないため、を使用して動的に作成できます。タイプ()。



def subclass_for_content_type(content_type):class Meta:db_table = Ticket._meta.db_table class Manager(models.Manager): '' 'クエリを単一のコンテンツタイプに制約する' '' def get_query_set(self):return super(Manager、self) .get_query_set()。filter(issue_ct = content_type)attrs = {'related_to':models.ForeignKey(content_type.model_class())、 '__ module __': 'myapp.models'、 'Meta':Meta、 'objects':Manager ()} return type( 'Ticket_%s'%content_type.name、(TicketBase、)、attrs)