작업 코드가 있지만 최근 관련 관리자 및 역방향 조회에 대해 배웠으며이 코드에 적용하는 방법을 알고 싶습니다.
관련 관리자 / 역 조회를 활용하고 싶은 해키 방법은 다음과 같습니다 get_by_type_for_user(self, user)
.
class BadgeAssertionQuerySet(models.query.QuerySet):
def get_user(self, user):
return self.filter(user = user)
def get_type(self, badge_type):
return self.filter(badge__badge_type = badge_type)
...
class BadgeAssertionManager(models.Manager):
def get_queryset(self):
return BadgeAssertionQuerySet(self.model, using=self._db)
...
def get_by_type_for_user(self, user):
types = BadgeType.objects.all()
qs = self.get_queryset().get_user(user)
by_type = [
{
'badge_type': t,
'list': qs.get_type(t)
} for t in types
]
return by_type
어디:
class BadgeAssertion(models.Model):
badge = models.ForeignKey(Badge)
user = models.ForeignKey(settings.AUTH_USER_MODEL)
...
objects = BadgeAssertionManager()
과:
class Badge(models.Model):
name = models.CharField(max_length=50, unique=True)
badge_type = models.ForeignKey(BadgeType)
....
과:
class BadgeType(models.Model):
name = models.CharField(max_length=50, unique=True)
...
내가 이것을 사용하는 것은 특정 사용자를 위해 배지 유형별로 정리하여 획득 한 배지를 출력하는 것입니다.
보기에서 :
context['badge_assertions_by_type'] = BadgeAssertion.objects.get_by_type_for_user(profile_user)
템플릿의 스 니펫 (사용자 프로필 페이지) :
{% for badges in badge_assertions_by_type %}
{{badges.badge_type.name}}
{% for assertion in badges.list %}
{{assertion.badge.name}}
{{assertion.time_issued}}
{% endfor %}
{% endfor %}
다음과 같이 방법을 단순화 할 수 있습니다.
def get_badges_by_type_for_user(self, user):
qs = self.get_queryset()
.select_related('badge', 'badge__badge_type')
.filter(user=user)
badges = defaultdict(list)
for badge_assertion in qs:
badges[badge_assertion.badge.badge_type].append(badge_assertion.badge)
return badges
사용 가능한 모든 BadgeType을 반복 할 필요는 없지만 얻은 어설 션을 배지 유형의 버킷으로 그룹화하기 만하면됩니다. 따라서 여과 badge_type
가 필요 하지 않습니다 . defaultdict()
여기 에서의 사용에 주목 하십시오. 이것을 시도하고 작동하는지 확인할 수 있습니다. 직접 테스트하지 않았습니다.
여기서는 결과 구조가 다릅니다. 이것의:
{
badge_type1: [badge1, badge2, ...],
badge_type2: [badge3, badge4, ...]
}
대신에:
[
{'badge_type' : badge_type1, 'list': [badge1, badge2]},
{'badge_type' : badge_type2, 'list': [badge3, badge4]}
]
첫 번째는 여기서 더 의미가 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다