Django manytomany 字段的读写操作及总结

功能:图片的点赞,要求一个ip能点赞多个图片,但是每个图片只能被相同的ip点赞一次,再次点赞则取消此ip对此图的点赞。

图片的model:

class CustomerWork(models.Model):
    Month = (
        (1, u'1月'),
        (2, u'2月'),
        (3, u'3月'),
        (4, u'4月'),
        (5, u'5月'),
        (6, u'6月'),
        (7, u'7月'),
        (8, u'8月'),
        (9, u'9月'),
        (10, u'10月'),
        (11, u'11月'),
        (12, u'12月'),
    )
    author = models.CharField(max_length=120, verbose_name='作者')
    age = models.CharField(max_length=120, verbose_name='作者年龄')
    name = models.CharField(max_length=120, verbose_name='作品名字')
    type_id = models.ForeignKey(CustomerWorkType, null=True, verbose_name='作品类型')
    month = models.IntegerField(verbose_name='月份', choices=Month)
    like_ips = models.ManyToManyField(IpSet, verbose_name='点赞ip', blank=True,)
    image = models.ImageField(blank=True, upload_to='customer_work/%Y%m%d', verbose_name='小艺术家作品')

    class Meta:
        verbose_name = '小艺术家作品'
        verbose_name_plural = "小艺术家作品"

    def __unicode__(self):
        return self.name

存储ip的model:

class IpSet(models.Model):
    ip_number = models.GenericIPAddressField()

    def __unicode__(self):
        return self.ip_number

以上,CustomerWork和IpSet通过like_ips多对多关联。

第一步,获取访问者的ip地址:

    if request.META.has_key('HTTP_X_FORWARDED_FOR'):
        ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        ip = request.META['REMOTE_ADDR']

然后判断此ip是否存在于数据库IpSet表中,可通过一下语句判断:

if IpSet.objects.filter(ip_number=ip)

若不在,则可以直接进行点赞操作:把此ip存入数据库,再把点赞的图片的like_ips加上此用户的ip(like_id是用户点赞的图片的id):

new_ip = IpSet()
new_ip.ip_number = ip
new_ip.save()
like_work = CustomerWork.objects.get(id=like_id)
like_work.like_ips.add(new_ip)
like_work.save()

若此ip在数据库中已然存在,则判断此图是否被次ip点赞过,若点过,则取消点赞,否则,点赞:

like_work = CustomerWork.objects.get(id=like_id)
user_ip = IpSet.objects.get(ip_number=ip)
if user_ip in like_work.like_ips.all():
     like_work.like_ips.remove(user_ip)
     print 'dianguo quxiao'
else:
     like_work.like_ips.add(user_ip)
     like_work.save()
     print 'meidian zan'

获取点赞数的方法是

CustomerWork.objects.get(id=like_id).like_ips.count()


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值