Django中的多对一关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中的多对一关系相关的知识,希望对你有一定的参考价值。

因此,我是django的新手。这是我的Location对象,

class Location(models.Model):
    country = models.CharField(max_length=255)
    city = models.CharField(max_length=255, unique=True)
    latitude = models.CharField(max_length=255)
    longitude = models.CharField(max_length=255)

这是我修改过的User对象

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(max_length=255, null=True)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_mobile_verified = models.BooleanField(default=False)
    location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)

这是用户注册API视图

class RegisterView(views.APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()

            subject = "Please Activate Your Account!"
            token = self._generate()
            link = HOST + PREFIX + str(user.id) + SUFFIX + token
            message = 'Please use the following link to activate your account.

{}'.format(link)
            from_email = settings.EMAIL_HOST_USER
            to_list = [user.email, 'melissa@gmail.com']
            send_mail(subject, message, from_email, to_list, fail_silently=True)

            Token.objects.create(user=user, token=token)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是相关的网址

url(r'^register/$', RegisterView.as_view(), name='register')

现在我想修改此端点以将位置ID作为路径参数,然后在我的UserCreation函数中添加逻辑,用户将其添加到id所描述的位置。有人可以帮我这么做吗?

答案

你可以这样做:

url(r'^register/(?P<location_id>[w.-]+)/$', RegisterView.as_view(), name='regist

然后,

def post(self, request, *args, **kwargs):
    self.location_id = kwargs.get('location_id', "any_default")
    location = Location.objects.get(id=self.location_id)
    # Now assign to user

    if serializer.is_valid():
        user = serializer.save()
        user.location = location
        user.save()

以上是关于Django中的多对一关系的主要内容,如果未能解决你的问题,请参考以下文章

django--ORM表的多对一关系

将 JSON 中的多对一关系保存到 Core Data

JPA命名查询中的多对一关系

如何正确映射与@IdClass 的多对一关系?

如何防止 EntityType 在与同一实体(父)的多对一关系中显示当前对象?

django - 从多对一关系中获取对象集