GenericForeignKeyを使用するのは初めてなので、クエリステートメントで機能させることができませんでした。テーブルはおおよそ次のようになります。
class Ticket(models.Model):
issue_ct = models.ForeignKey(ContentType, related_name='issue_content_type')
issue_id = models.PositiveIntegerField(null=True, blank=True)
issue = generic.GenericForeignKey('issue_ct', 'issue_id')
class Issue(models.Model):
scan = models.ForeignKey(Scan)
スキャンによって1つの課題が作成され、課題によっていくつかのチケットが生成されます。チケットテーブルの外部キーとして課題を作成しました。これでScanオブジェクトができました。このスキャンに関連するすべてのチケットを照会したいと思います。私はこれを最初に試しました:
tickets = Tickets.objects.filter(issue__scan=scan_obj)
これは機能しません。それから私はこれを試しました:
issue = Issue.objects.get(scan=scan_obj)
content_type = ContentType.objects.get_for_model(Issue)
tickets = Tickets.objects.filter(content_type=content_type, issue=issue)
それでも動作しません。私はジャンゴでこれらの種類のクエリを行う方法を知る必要がありますか?ありがとう。
定義したTicket.issue
フィールドは、Ticket
インスタンスから、それがアタッチされているIssue
に移動するのに役立ちますが、後戻りすることはできません。 2つ目の例は終わりですが、issue_id
フィールドを使用する必要があります-GenericForeignKey
に対してクエリを実行することはできません(Ticket
instance)。これを試して:
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))
GenericForeignKey
でフィルタリングするには、_db_table
_をTicket
と共有する2番目のモデルを作成します。まず、チケットを抽象モデルと具象モデルに分割します。
_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(models.Model):
issue = generic.GenericForeignKey('issue_ct', 'issue_id')
_
次に、TicketBase
もサブクラス化するモデルを作成します。このサブクラスには、issue
として定義されているForeignKey
を除き、すべて同じフィールドがあります。カスタムManager
を追加すると、単一のContentType
だけにフィルタリングできます。
このサブクラスは同期または移行する必要がないため、type()
を使用して動的に作成できます。
_def subclass_for_content_type(content_type):
class Meta:
db_table = Ticket._meta.db_table
class Manager(models.Manager):
""" constrain queries to a single content type """
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)
_